구현, 시뮬레이션 사용.
문제는 쉽다고 생각했으나 주사위를 굴리는 걸 어떻게 표현해야하나를 1시간 이상 고민해도 답을 찾지 못했음. 이 과정에서 주사위를 굴리는 방법만 다른 사람의 블로그를 참고.
처음에 주사위의 각각 인덱스를 0~5라고 했을 때,
0~5에 해당하는 값을 각각
dice[0]=1;
dice[1]=3;
dice[2]=5;
dice[3]=6;
dice[4]=2;
dice[5]=4;
라고 하겠다. 그것을 표현하기 전이 주사위를 굴리기 전의 사진이다.
이것을 주사위를 굴렸을 때로 표현한 것이 동, 서, 남, 북의 이동이다.
사실 이것만으로도 이해를 확실하게 못하겠다면, 나처럼 주사위를 하나 만들어 보는 것도 추천한다.
집에 주사위가 있다면 좋겠지만, 주사위가 없어서 하나 만들어서 직접 굴려가면서 문제를 이해했다.
import java.util.*;
import java.io.*;
public class Main{
static int dy[]= {-1,0,1,0};
static int dx[]= {0,-1,0,1};
static char dice[]=new char[6];
static StringBuilder sb=new StringBuilder();
static char map[][];
static int y,x;
public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
Arrays.fill(dice,'0');
st=new StringTokenizer(br.readLine());
int N=Integer.parseInt(st.nextToken());
int M=Integer.parseInt(st.nextToken());
y=Integer.parseInt(st.nextToken());
x=Integer.parseInt(st.nextToken());
int K=Integer.parseInt(st.nextToken());
map=new char[N][M];
for(int i=0;i<N;i++) {
st=new StringTokenizer(br.readLine());
for(int j=0;j<M;j++) {
map[i][j]=st.nextToken().charAt(0);
}
}
st=new StringTokenizer(br.readLine());
for(int i=0;i<K;i++) {
int num=Integer.parseInt(st.nextToken());
rollDice(num);
}
System.out.println(sb);
}
public static void rollDice(int num) {
int prevY=y;
int prevX=x;
switch(num) {
case 1: x++; break;
case 2: x--; break;
case 3: y--; break;
case 4: y++; break;
}
//범위 넘어가면 명령 무시
if(y<0||x<0||y>=map.length||x>=map[0].length) {
y=prevY;
x=prevX;
return;
}
char copyDice[]=dice.clone();
switch(num) {
case 1:
dice[1]= copyDice[4]; dice[3]= copyDice[5];
dice[4]= copyDice[3]; dice[5]= copyDice[1];
break;
case 2:
dice[1]= copyDice[5]; dice[3]= copyDice[4];
dice[4]= copyDice[1]; dice[5]= copyDice[3];
break;
case 3:
dice[0]= copyDice[1]; dice[1]= copyDice[2];
dice[2]= copyDice[3]; dice[3]= copyDice[0];
break;
case 4:
dice[0]= copyDice[3]; dice[1]= copyDice[0];
dice[2]= copyDice[1]; dice[3]= copyDice[2];
break;
}
if(map[y][x]=='0')
map[y][x]=dice[3];
else {
dice[3]=map[y][x];
map[y][x]='0';
}
sb.append(dice[1]).append('\n');
}
}
이번 문제는 막상 맞닥뜨렸을 때에는 주사위를 굴리는 것을 어떻게 표현해야하나 막막해서 조금 힘들었는데, 막상 완전히 이 문제를 다 이해하고 나니 알차다고 생각한다. 재밌다.
사고력을 길러주는 문제가 아닐까 한다.
하루에 백준 1문제 이상 푸는 것을 목표로 하고있다.
https://solved.ac/profile/anwlro0212