ALGORITHM
백준 14499 주사위 굴리기 (Java)
공부하는_다온
2023. 5. 6. 21:21
1. 문제 링크
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
2. 문제 및 입출력예제
3. 문제 풀이
주사위 6면을 한 번에 다루면서 숫자를 옮겼다. 주사위가 떨어지는 1 2 3 4 방향에 따라 주사위 6면 전부를 움직였다.
- 주사위 배열은 상단, 하단, 동, 서, 남, 북 순으로 조작했다.
- 입력받은 명령에 따라 주사위에서 바꾸는 4부분의 값의 바꿨다.
- 도착한 바닥이 0이면 바닥에 주사위 하단의 숫자를 바닥에 넣는다.
- 도착한 바닥이 숫자라면 주사위 하단에 해당 숫자를 저장하고 바닥을 0으로 만든다.
- 바뀐 위치로 반복문을 돈다.
4. 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int[] dx = {0,0,-1,1};
int[] dy = {1,-1,0,0};
String[] split = br.readLine().split(" ");
int N = Integer.parseInt(split[0]);
int M = Integer.parseInt(split[1]);
int x = Integer.parseInt(split[2]);
int y = Integer.parseInt(split[3]);
int K = Integer.parseInt(split[4]);
int[][] map = new int[N][M];
for(int i=0;i<N;i++) {
split = br.readLine().split(" ");
for(int j=0;j<M;j++) {
map[i][j] = Integer.parseInt(split[j]);
}
}
split = br.readLine().split(" ");
int[] dice = {0, 0, 0, 0, 0, 0}; //위, 아래, 동, 서, 남, 북
int temp;
for(int i=0;i<K;i++) {
int command = Integer.parseInt(split[i])-1;
int X = x + dx[command];
int Y = y + dy[command];
if(X<0 || X>=N || Y<0 || Y>=M) continue;
switch(command) {
case 0: //동
//위 0 -> 동2 -> 아래1 -> 서3 -> 위0
temp = dice[0];
dice[0] = dice[3];
dice[3] = dice[1];
dice[1] = dice[2];
dice[2] = temp;
break;
case 1: //서
//위 0 -> 서3 -> 아래1 -> 동2 -> 위0
temp = dice[0];
dice[0] = dice[2];
dice[2] = dice[1];
dice[1] = dice[3];
dice[3] = temp;
break;
case 2: //북
//위0 -> 북5 -> 아래1 -> 남4 -> 위0
temp = dice[0];
dice[0] = dice[4];
dice[4] = dice[1];
dice[1] = dice[5];
dice[5] = temp;
break;
case 3: //남
//위0 -> 남4 -> 아래1 -> 북5 -> 위0
temp = dice[0];
dice[0] = dice[5];
dice[5] = dice[1];
dice[1] = dice[4];
dice[4] = temp;
break;
}
int floor = map[X][Y]; //바닥면에 있는 글자
if(floor == 0) { //바닥이 0이면
map[X][Y] = dice[1];
}
else { //바닥에 글자가 있으면
dice[1] = floor;
map[X][Y] = 0;
}
x = X;
y = Y;
sb.append(dice[0]).append("\n");
}
System.out.println(sb);
}
}