📍 문제 설명
💡 접근
십자 모양의 주사위지만 주사위의 숫자를 담는 일차원 배열을 사용해서 방향에 따라 전개도에 맞는 숫자가 들어가도록 하였음
1. 위와 같이 동서북남에 따라 방향에 맞게 주사위의 값을 변경시켜준다.
2. 이동한 칸의 수에 따라 조건에 맞는 처리를 해준다.
👩💻 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int n, m, v, e, k, r, x, y, answer, cnt;
static int[] arr, dice;
static long[] dp;
static int[][] board, result;
static boolean[][] visited;
static int[] dx = {0,0,-1,1};
static int[] dy = {1,-1,0,0};
static ArrayList<Integer> list;
static StringBuilder sb;
static Queue<Integer> q;
public static void main(String[] args) throws IOException {
Main T = new Main();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
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());
//지도에 쓰여있는 수
board = new int[n][m];
//주사위에 쓰여있는 숫자
dice = new int[7];
for(int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 0; j < m; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
}
}
//주사위 이동시키는 명령
arr = new int[k];
st = new StringTokenizer(br.readLine());
for(int i = 0; i < k; i++) arr[i] = Integer.parseInt(st.nextToken());
sb = new StringBuilder();
T.solution();
System.out.println(sb);
}
private void solution() {
//주사위 k번 굴리기
for(int i = 0; i < k; i++) {
//해당 방향으로 주사위 이동
int nx = x + dx[arr[i]-1];
int ny = y + dy[arr[i]-1];
if(nx<0 || ny<0 || nx>=n || ny>=m) continue;
//해당 방향으로 주사위 굴리기
changeDice(arr[i]);
//이동한 칸의 쓰인 수가 0이면 주사위 바닥면에 쓰여있는 수가 칸에 복사
if(board[nx][ny] == 0) {
board[nx][ny] = dice[6];
}
//이동한 칸의 쓰인 수가 0이 아니면 칸에 쓰여있는 수가 주사위 바닥면으로 복사되고 칸은 0이됨
else {
dice[6] = board[nx][ny];
board[nx][ny] = 0;
}
x = nx;
y = ny;
sb.append(dice[1]).append("\n");
}
}
public static void changeDice(int direction) {
int[] clone = dice.clone();
// 1은 윗면 6은 바닥면
// 동서북남
if (direction == 1) {
dice[1] = clone[4];
dice[3] = clone[1];
dice[4] = clone[6];
dice[6] = clone[3];
} else if (direction == 2) {
dice[1] = clone[3];
dice[3] = clone[6];
dice[4] = clone[1];
dice[6] = clone[4];
} else if (direction == 3) {
dice[1] = clone[5];
dice[2] = clone[1];
dice[5] = clone[6];
dice[6] = clone[2];
} else {
dice[1] = clone[2];
dice[2] = clone[6];
dice[5] = clone[1];
dice[6] = clone[5];
}
}
private static class Point implements Comparable<Point> {
private int x;
private int y;
private int crush;
public Point(int x, int y, int crush) {
this.x = x;
this.y = y;
this.crush = crush;
}
@Override
public String toString() {
return "Point{" +
"x=" + x +
", y=" + y +
", crush=" + crush +
'}';
}
@Override
public int compareTo(Point o) {
return this.crush - o.crush;
}
}
}