문제 링크 ▶︎ 주사위 굴리기
초기에 세팅된 주사위의 위치를 저장해서 한번씩 굴릴때마다 주사위 눈이 변경되는 것을 위치에 맞게 이동시키는 것이 중요해보인다. 그리고 주사위와 좌표의 숫자에 따라서 조건이 바뀌기 때문에 해당 로직을 잘 구성해야할 것 같다.
주사위 눈은 정육면체 기준으로 6개의 위치에 맞게 1~6으로 설정하고 해시맵을 통해서 주사위 눈을 저장하고, 해당 위치는 변수로 받아서 계속 변경해주면 된다.
해시맵을 통해서 키 값은 1~6, 그리고 밸류는 해당 주사위 위치에 어떤 숫자가 적혀있는지를 저장한다.
문제에서 설정함에 따라서 top에 1, bottom에 6, ... 이런식으로 주사위 위치에 따라서 변수를 정해주고, 동서북남 순서에 맞게 order가 들어오면 좌표를 이동시킨다.
좌표가 조건에 맞는다면, 동서북남에 따라서 주사위를 이동시켜준다. 여기에서 동서가 유사하고, 북남이 유사하다. 이후에 만약 좌표가 0이라면 해당 좌표에 주사위에 적힌 숫자를 복사해주고 아니라면 주사위에 해당 좌표를 넣는데 이때 해시맵을 수정해주면 된다. 그리고 좌표는 0으로 바꿔준다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static int n, m;
public static int[][] dirs = new int[][]{{0,0}, {0,1}, {0,-1}, {-1,0}, {1,0}};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
int[][] grid = new int[n][m];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < m; j++) {
grid[i][j] = Integer.parseInt(st.nextToken());
}
}
int[] order = new int[k];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < k; i++) {
order[i] = Integer.parseInt(st.nextToken());
}
Map<Integer, Integer> dice = new HashMap<>(); // 동 서 북 남
for (int i = 1; i < 7; i++) {
dice.put(i, 0); // 1-6 , 3-4 , 2-5
}
int top = 1, bottom = 6, front = 5, back = 2, left = 4, right = 3;
for (int i = 0; i < order.length; i++) {
int dir = order[i];
y += dirs[dir][0];
x += dirs[dir][1];
if (0 <= x && x < m && 0 <= y && y < n) {
if (dir == 1) { // 동
int temp = top;
top = left;
left = bottom;
bottom = right;
right = temp;
} else if (dir == 2) { // 서
int temp = top;
top = right;
right = bottom;
bottom = left;
left = temp;
} else if (dir == 3) { // 북
int temp = top;
top = front;
front = bottom;
bottom = back;
back = temp;
} else { // 남
int temp = top;
top = back;
back = bottom;
bottom = front;
front = temp;
}
if (grid[y][x] != 0) {
dice.put(bottom, grid[y][x]);
grid[y][x] = 0;
} else {
grid[y][x] = dice.get(bottom);
}
System.out.println(dice.get(top));
} else {
y -= dirs[dir][0];
x -= dirs[dir][1];
}
}
}
}
문제에 대한 이해와 주사위를 돌리는 로직에서 시간을 많이 썼는데 구현 자체는 어렵지 않았다. 더 좋은 방법으로는 해시맵을 쓰지않고 배열을 사용해서 배열의 주소로 주사위 위치를 인지하고 해당 주소에 값을 매핑하면서 해당 주사위 위치에 적힌 숫자를 구현할 수도 있다.