package BOJ;
import java.util.*;
public class 주사위굴리기 {
static int[] dice = new int[7];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt(); //지도 세로
int m = in.nextInt(); //지도 가로
int dice_x = in.nextInt();
int dice_y = in.nextInt(); //주사위 x,y좌표
int k = in.nextInt(); //명령의 개수
int[][] map = new int[n][m];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
map[i][j] = in.nextInt();
}
}
int[] instruction = new int[k];
for(int i=0;i<k;i++){
instruction[i] = in.nextInt();
}
//동 서 북 남
int[] dy = {1,-1,0,0};
int[] dx = {0,0,-1,1};
for(int i=0;i<k;i++){
int dir = instruction[i];
int next_x = dice_x+dx[dir-1];
int next_y = dice_y+dy[dir-1];
if(next_x>=0 && next_x<n && next_y>=0 && next_y<m){
dice_x = next_x;
dice_y = next_y;
roll(dir);
if(map[next_x][next_y]==0){
map[next_x][next_y] = dice[1];
}
else{
dice[1] = map[next_x][next_y];
map[next_x][next_y] = 0;
}
System.out.println(dice[6]);
}
}
}
static void roll(int dir){
int[] copy = dice.clone();
switch (dir){
case 1:{
//동
dice[4] = copy[1];
dice[1] = copy[3];
dice[3] = copy[6];
dice[6] = copy[4];
break;
}
case 2:{
//서
dice[4] = copy[6];
dice[1] = copy[4];
dice[3] = copy[1];
dice[6] = copy[3];
break;
}
case 3:{
//남
dice[2] = copy[6];
dice[1] = copy[2];
dice[5] = copy[1];
dice[6] = copy[5];
break;
}
case 4:{
//북
dice[2] = copy[1];
dice[1] = copy[5];
dice[5] = copy[6];
dice[6] = copy[2];
break;
}
}
}
}
명령 for문 {
현재 주사위 위치에서 해당 명령 방향으로 굴렸을 경우 다음 위치 구하기
-> 다음 위치가 정해진 범위(지도크기)를 넘어갈 경우에는 다음 수행x
-> 안넘어갈 경우에 주사위를 굴리고(주사위 값 바꿔주기), 출력 수행
}
문제 자체는 시뮬레이션 문제라 크게 어렵지 않았는데 주사위를 굴릴때마다 달라지는 면들을 어떻게 바꿔줘야할지 감이 잘 안왔음.
가로 세로 따로 배열로 보고 굴릴 생각까지는 했는데 이게 굴린다고 생각하니까 너무 어렵게 느껴졌음. 밑에 글을 참고하니 그냥 붙은 면에 값만 바꿔준다는 식으로 이해하니까 잘 풀렸음.