일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- DP
- 텐션 업 10기!
- 우유가 옆으로 넘어지면 아야
- 수학
- amazon
- 자료구조
- SSAFY 10기 화이팅
- 코로나 싫어요
- SSAFY 테스트
- 우유아야
- 네트워크
- SSAFY 화이팅
- 자고 싶다
- HAVE A GOOD DAY
- 모르고리즘
- Hamming weight
- Java 환경 설정
- have a nice day
- SSAFY IM/A
- 아자아자 화이팅
- DFS
- LeetCode #릿코드 #좋은 하루 되세요 #Have a nice day
- SeongSeobDang
- BFS
- 텐션 업 10기 화이팅
- Have a nice day.
- Have a good day :)
- I am Korean
- 우유가옆으로넘어지면아야
- Today
- Total
Hope Everyone Is Happy
[골드4] 14499. 주사위 굴리기 (Java) 본문
[골드4] 14499. 주사위 굴리기 (Java)
J 크 2023. 10. 17. 17:37https://www.acmicpc.net/problem/14499
14499번: 주사위 굴리기
첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x, y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지
www.acmicpc.net
구른다,,
※ 문제를 요약하면 아래와 같습니다.
▶ 크기가 NxM인 맵에 주사위의 시작 좌표가 주어지며, 명령의 개수가 주어짐
▶ 주사위는 각 명령에 해당하는 방향으로 이동과 동시에 구르게 됨 ( 동 : 1, 서 : 2, 북 : 3, 남 : 4)
▶ 이 때 맵의 값이 0이면, 주사위의 바닥면에 쓰여있는 수가 맵으로 복사
▶ 맵의 값이 0이 아니면 주사위의 바닥면으로 맵의 값이 복사, 맵의 값은 0으로 변환
▶ 모든 명령이 끝난 후 주사위의 상단에 쓰여있는 값 출력
▶ Input : 첫째 줄에 지도의 세로 크기 N, 가로 크기 M, 주사위를 놓는 좌표 Row, Col, 명령의 개수 K
이후 N개의 줄에 맵의 값, 마지막 줄에 K개 만큼 공백을 구분으로 명령 입력
▶ Output : 이동할 때 마다 주사위의 윗면 수 출력, 바깥으로 이동시키려고 하는 경우, 해당 명령 무시 && 출력 X
◈ Input - 1
4 2 0 0 8
0 2
3 4
5 6
7 8
4 4 4 1 3 3 3 2
◈ Output - 1
0
0
3
0
0
8
6
3
◈ Input - 2
3 3 1 1 9
1 2 3
4 0 5
6 7 8
1 3 2 2 4 4 1 1 3
◈ Output - 2
0
0
0
3
0
1
0
6
0
◈ Input - 3
2 2 0 0 16
0 2
3 4
4 4 4 4 1 1 1 1 3 3 3 3 2 2 2 2
◈ Output - 3
0
0
0
0
◎ 코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.
▶ 주사위의 정보를 4(row)x3(col) 크기의 2차원 배열로 저장
(0,1) (1,0) (1,1) (1,2) (2,1) (3,1) 만 주사위의 값으로 사용
▶ 각각의 화살표 방향으로 주사위를 굴렸을 때 아래 그림에서 규칙 확인 가능
1. 세로로 움직일 때 가운데 열 (0,1) , (1,1), (2,1), (3,1)에 해당하는 배열값들만 해당 방향의 반대로 배열값이 이동
2. 가로로 움직일 때 2번째 행 과 (3,1)의 배열값만 이동하며, 해당하는 방향의 반대로 배열값이 이동
▶ 동, 서, 북, 남 방향을 델타 탐색으로 맵을 이동, 맵 벗어날 시 주사위 움직임 및 출력 금지
▶ 주사위의 바닥면 == (3,1), 주사위의 상단면은 (1,1)로 설정, 바닥면을 맵과 비교
▶ 다음 방향의 맵의 값이 0이면 주사위의 바닥면 값을 맵에 적용
▶ 다음 방향의 맵의 값이 0이아니면 맵의 값을 주사위의 바닥면 값으로 옮긴 후 0으로 변경
▶ 주사위 움직일 때 마다 상단면 (1,1) 출력
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.StringTokenizer;
public class Main {
static int N, M, nDicePoint;
static int[][] narrMap, narrDice;
static int[] nDice;
// 동, 서, 북, 남
static int dr[] = { 0, 0, -1, 1 };
static int dc[] = { 1, -1, 0, 0 };
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(bReader.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
int nRow = Integer.parseInt(st.nextToken());
int nCol = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
narrMap = new int[N][M];
narrDice = new int[4][3];
// 맵의 좌표 값 입력받자
for (int i = 0; i < N; i++) {
st = new StringTokenizer(bReader.readLine());
for (int j = 0; j < M; j++) {
narrMap[i][j] = Integer.parseInt(st.nextToken());
}
}
st = new StringTokenizer(bReader.readLine());
for (int i = 0; i < K; i++) {
int nDirect = Integer.parseInt(st.nextToken());
// 이동 고고
int nSearchRow = nRow + dr[nDirect - 1];
int nSearchCol = nCol + dc[nDirect - 1];
if (nSearchRow < 0 || nSearchCol < 0 || nSearchRow >= N || nSearchCol >= M)
continue;
MoveDice(nDirect - 1);
// 바닥면이 0이면 ? 맵의 값을 넣어준다.
if (narrMap[nSearchRow][nSearchCol] == 0) {
narrMap[nSearchRow][nSearchCol] = narrDice[3][1];
} else {
// 아니면 칸에 쓰여있는 수가 주사위의 바닥면으로 복사되며, 칸은 0이된다.
narrDice[3][1] = narrMap[nSearchRow][nSearchCol];
narrMap[nSearchRow][nSearchCol] = 0;
}
nRow = nSearchRow;
nCol = nSearchCol;
bWriter.write(narrDice[1][1] + "\n");
}
bWriter.close();
}
private static void MoveDice(int nDirect) {
// 주사위가 동쪽으로
if (nDirect == 0) {
int nTemp = narrDice[1][0];
for (int i = 0; i < 2; i++)
narrDice[1][i] = narrDice[1][i + 1];
narrDice[1][2] = narrDice[3][1];
narrDice[3][1] = nTemp;
}
// 서
if (nDirect == 1) {
int nTemp = narrDice[1][2];
for (int i = 2; i > 0; i--)
narrDice[1][i] = narrDice[1][i - 1];
narrDice[1][0] = narrDice[3][1];
narrDice[3][1] = nTemp;
}
// 북
if (nDirect == 2) {
int nTemp = narrDice[3][1];
for (int i = 3; i > 0; i--)
narrDice[i][1] = narrDice[i - 1][1];
narrDice[0][1] = nTemp;
}
// 남
if (nDirect == 3) {
int nTemp = narrDice[0][1];
for (int i = 0; i < 3; i++)
narrDice[i][1] = narrDice[i + 1][1];
narrDice[3][1] = nTemp;
}
}
}
Good Luck! (피드백 감사합니다!)
'※ 백준 (Baekjoon) > [Java] 문제 풀이 ( Solve the problems)' 카테고리의 다른 글
[골드4] 14502. 연구소 (Java) (2) | 2023.10.19 |
---|---|
[골드4] 14500. 테트로미노 (Java) (0) | 2023.10.18 |
[실버 3] 11540. Competition (Java) (1) | 2023.10.16 |
[골드3] 20440. 🎵니가 싫어 싫어 너무 싫어 싫어 오지 마 내게 찝쩍대지마🎵 - 1 (Java) (3) | 2023.10.15 |
[골드5] 1916. 최소 비용 구하기 (Java) (0) | 2023.10.15 |