솔루션 방법
직접 정육면체를 그려서 동서남북으로 하나씩 굴려가며 재배치하는 방법을 알아냈습니다.
암호
package test;
import java.io.*;
import java.util.*;
public class 주사위굴리기 {
/*
4 2 0 0 8
0 2
3 4
5 6
7 8
4 4 4 1 3 3 3 2
* */
public static void main(String() args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());//세로
int M = Integer.parseInt(st.nextToken());//가로
int x = Integer.parseInt(st.nextToken());//첫위치세로
int y = Integer.parseInt(st.nextToken());//첫위치가로
int K = Integer.parseInt(st.nextToken()); // 명령의 갯수
int ()()map = new int(N)(M);
int ()command = new int(K);
int ()dice = new int(6); // 밑 오 왼 상 하 위
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());
}
}
st = new StringTokenizer(br.readLine());
for(int i = 0; i< K; i++) {
command(i) = Integer.parseInt(st.nextToken());
//굴릴떄 주사위의 위치를 조정해주기위해
int temp0=dice(0); //밑
int temp1=dice(1); //오
int temp2=dice(2); //왼
int temp3=dice(3); //상
int temp4=dice(4); //하
int temp5=dice(5); //위
//동 서 북 남 1 2 3 4
if(command(i) == 1) {
//이동했을때 좌표가 map안에 있을때만 윗면 수 출력. 아니면 그냥 무시
int dy = y+1;
if(x>=0 && x<N && dy>=0 && dy<M) {
y+=1;
//System.out.println("현재 좌표"+x+" "+y);
//System.out.println("지금주사위"+temp0+" "+temp1+" "+temp2+" "+temp3+" "+temp4+" "+temp5);
//주사위 동쪽으로 먼저굴리고
dice(0) = temp1;
dice(1) = temp5;
dice(2) = temp0;
dice(3) = temp3;
dice(4) = temp4;
dice(5) = temp2;
//현재 좌표 map에 숫자가 있으면 or 숫자가 0이면
if(map(x)(y)!=0) {
dice(0) = map(x)(y); //주사위에 밑에 좌표 에있던 값 추가하고
map(x)(y) = 0; //좌표는 0으로 바뀜
}else {
map(x)(y) = dice(0); //반대로 주사위에 있던 수가 좌표로 옮겨감
}
System.out.println(dice(5));
}else {
continue;
}
}else if(command(i)==2) {//주사위 서쪽으로 굴렸을때
//이동했을때 좌표가 map안에 있을때만 윗면 수 출력. 아니면 그냥 무시
int dy = y-1;
if(x>=0 && x<N && dy>=0 && dy<M) {
y-=1;
//System.out.println("현재 좌표"+x+" "+y);
// System.out.println("지금주사위"+temp0+" "+temp1+" "+temp2+" "+temp3+" "+temp4+" "+temp5);
//주사위 서쪽으로 먼저굴리고
dice(0) = temp2;
dice(1) = temp0;
dice(2) = temp5;
dice(3) = temp3;
dice(4) = temp4;
dice(5) = temp1;
//현재 좌표 map에 숫자가 있으면 or 숫자가 0이면
if(map(x)(y)!=0) {
dice(0) = map(x)(y); //주사위에 밑에 좌표 에있던 값 추가하고
map(x)(y) = 0; //좌표는 0으로 바뀜
}else {
map(x)(y) = dice(0); //반대로 주사위에 있던 수가 좌표로 옮겨감
}
System.out.println(dice(5));
}else {
continue;
}
}else if(command(i)==3) {//주사위 북쪽으로 굴렸을때
//이동했을때 좌표가 map안에 있을때만 윗면 수 출력. 아니면 그냥 무시
int dx = x-1;
if(dx>=0 && dx<N && y>=0 && y<M) {
x=dx;
// System.out.println("현재 좌표"+x+" "+y);
//System.out.println("지금주사위"+temp0+" "+temp1+" "+temp2+" "+temp3+" "+temp4+" "+temp5);
//주사위 북쪽으로 먼저굴리고
dice(0) = temp3;
dice(1) = temp1;
dice(2) = temp2;
dice(3) = temp5;
dice(4) = temp0;
dice(5) = temp4;
//현재 좌표 map에 숫자가 있으면 or 숫자가 0이면
if(map(x)(y)!=0) {
dice(0) = map(x)(y); //주사위에 밑에 좌표 에있던 값 추가하고
map(x)(y) = 0; //좌표는 0으로 바뀜
}else {
map(x)(y) = dice(0); //반대로 주사위에 있던 수가 좌표로 옮겨감
}
System.out.println(dice(5));
}else {
continue;
}
}else if(command(i)==4) {//주사위 남쪽으로 굴렸을때
//이동했을때 좌표가 map안에 있을때만 윗면 수 출력. 아니면 그냥 무시
int dx = x+1;
if(dx>=0 && dx<N && y>=0 && y<M) {
x=dx;
// System.out.println("현재 좌표"+x+" "+y);
//System.out.println("지금주사위"+temp0+" "+temp1+" "+temp2+" "+temp3+" "+temp4+" "+temp5);
//주사위 남쪽으로 먼저굴리고
dice(0) = temp4;
dice(1) = temp1;
dice(2) = temp2;
dice(3) = temp0;
dice(4) = temp5;
dice(5) = temp3;
//현재 좌표 map에 숫자가 있으면 or 숫자가 0이면
if(map(x)(y)!=0) {
dice(0) = map(x)(y); //주사위에 밑에 좌표 에있던 값 추가하고
map(x)(y) = 0; //좌표는 0으로 바뀜
}else {
map(x)(y) = dice(0); //반대로 주사위에 있던 수가 좌표로 옮겨감
}
System.out.println(dice(5));
}else {
continue;
}
}
}
}
}