BOJ 14499: 주사위 굴리기 https://www.acmicpc.net/problem/14499
윗 면이 1이고
, 동쪽을 바라보는 방향이 3인 상태
로 놓여져 있으며, 놓여져 있는 곳의 좌표는 (x, y) 이다.가장 처음
에 주사위에는 모든 면에 0
이 적혀져 있다.예를 들어,
- 주사위를
동쪽으로 한 번 굴리게 되면
주사위의위 쪽 면
은이전 상태의 서 쪽 면
에 있던 면이 오게 된다.
0
이라면0
이 아니라면import java.util.*;
import java.io.*;
public class Main {
static int N, M, x, y, K;
static int[][] map;
static int[] dice; // 주사위의 위치에 적힌 값을 기록할 배열 -> 위/동/서/남/북/아래 순으로 기록함
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken()); // 지도의 세로 크기
M = Integer.parseInt(st.nextToken()); // 지도의 가로 크기
// 주사위 놓은 곳의 좌표
x = Integer.parseInt(st.nextToken());
y = Integer.parseInt(st.nextToken());
// 명령의 개수
K = Integer.parseInt(st.nextToken());
map = new int[N][M];
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for(int j=0; j<M; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
// 처음엔 주사위에 0만 적혀있다.
dice = new int[]{0, 0, 0, 0, 0, 0};
st = new StringTokenizer(br.readLine(), " ");
// 명령을 순서대로 수행
for(int i=0; i<K; i++) {
int order = Integer.parseInt(st.nextToken());
int nowX = x;
int nowY = y;
// 주사위 바닥 면의 다음 좌표를 구함
moveFloor(order);
// 만약 좌표가 범위를 벗어났다면
// 다시 이전의 좌표로 되돌리고 continue
if(x < 0 || y < 0 || x >= N || y >= M) {
x = nowX;
y = nowY;
continue;
}
// 주사위를 명령에 맞춰 굴린 다음의 상태를 구함
int[] nDice = moveDice(order);
dice = nDice;
// 만약 이동한 칸에 적힌 숫자가 0이라면
if(map[x][y] == 0) {
// 주사위의 밑 면에 적힌 숫자를 칸에 복사함
map[x][y] = dice[5];
}
// 이동한 칸에 적힌 숫자가 0이 아니라면
else {
// 주사위의 바닥 면에 칸에 적힌 숫자를 복사함
dice[5] = map[x][y];
// 그 칸의 숫자는 0으로 갱신함
map[x][y] = 0;
}
// 주사위의 윗 면에 적혀 있는 숫자만 StringBuilder에 넣음
sb.append(dice[0]).append("\n");
}
System.out.println(sb);
}
// 주사위 바닥 면의 다음 좌표를 구하는 메소드
static void moveFloor(int order) {
switch(order) {
// 동쪽으로 굴림
case 1:
y++;
break;
// 서쪽으로 굴림
case 2:
y--;
break;
// 북쪽으로 굴림
case 3:
x--;
break;
// 남쪽으로 굴림
case 4:
x++;
break;
default:
break;
}
}
// 명령에 따라 주사위 면의 위치를 갱신하는 메소드
static int[] moveDice(int order) {
int[] nDice = new int[6];
switch(order) {
// 동쪽으로 굴림
case 1:
nDice[0] = dice[2];
nDice[1] = dice[0];
nDice[2] = dice[5];
nDice[3] = dice[3];
nDice[4] = dice[4];
nDice[5] = dice[1];
break;
// 서쪽으로 굴림
case 2:
nDice[0] = dice[1];
nDice[1] = dice[5];
nDice[2] = dice[0];
nDice[3] = dice[3];
nDice[4] = dice[4];
nDice[5] = dice[2];
break;
// 북쪽으로 굴림
case 3:
nDice[0] = dice[3];
nDice[1] = dice[1];
nDice[2] = dice[2];
nDice[3] = dice[5];
nDice[4] = dice[0];
nDice[5] = dice[4];
break;
// 남쪽으로 굴림
case 4:
nDice[0] = dice[4];
nDice[1] = dice[1];
nDice[2] = dice[2];
nDice[3] = dice[0];
nDice[4] = dice[5];
nDice[5] = dice[3];
break;
default:
break;
}
return nDice;
}
}