https://www.acmicpc.net/problem/14499
문제의 설명을 잘 이해해야 풀 수 있는 문제라고 생각됩니다. 설명에 주사위의 전개도가 주어지는데, 주사위의 방향을 결정하는 명령어에 따라 밑면뿐 아니라 4개의 면이 바뀌기 때문에, 인덱스를 정해놓고 방향에 따라 어떤 인덱스(면)가 어디로 바뀌는지 꼼꼼하게 살펴봐야 할 것 같습니다.
전개도는 다음과 같습니다.
이렇게 되어있을때 만약 밑면이 1이라고 가정하면 6은 윗면이 되고, 2,4,5,3은 옆면이 될 것입니다. 여기서 만약 주사위가 동쪽이나 서쪽으로 구른다면 밑면은 4 혹은 3이 되고 남쪽이나 북쪽으로 구른다면 밑면은 5나 2가 되겠죠. 따라서 구르는 방향에 따라 배열의 인덱스가 어디로 바뀔지 예상하여 case별로 지정해주고 나면 그 뒤에는 해결하기 수월합니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
// 1
// 234
// 5
// 6
static int[] dice = new int[7];
static int n,m,x,y;
static int[][] map;
static int[] dx = {1, -1, 0, 0};
static int[] dy = {0, 0, -1, 1};
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());
y = Integer.parseInt(st.nextToken());
x = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
map = new int[n][m];
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++) {
int d = Integer.parseInt(st.nextToken());
move(d);
}
}
static void move(int d) {
int nx = x + dx[d-1];
int ny = y + dy[d-1];
if(nx <0 || ny < 0 || nx > m-1 || ny > n-1) return;
roll(d, nx, ny);
x = nx; y = ny;
}
// 1 2 3 4 (동 서 남 북)
static void roll(int d, int x, int y) {
int tmp = dice[3];
switch(d) {
case 1:
dice[3] = dice[4];
dice[4] = dice[6];
dice[6] = dice[2];
dice[2] = tmp;
break;
case 2:
dice[3] = dice[2];
dice[2] = dice[6];
dice[6] = dice[4];
dice[4] = tmp;
break;
case 3:
dice[3] = dice[5];
dice[5] = dice[6];
dice[6] = dice[1];
dice[1] = tmp;
break;
case 4:
dice[3] = dice[1];
dice[1] = dice[6];
dice[6] = dice[5];
dice[5] = tmp;
break;
}
if(map[y][x] == 0) {
map[y][x] = dice[6];
} else {
dice[6] = map[y][x];
map[y][x] =0;
}
System.out.println(dice[3]);
}
}
'Koala - 11기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[백준 / Python] 1253번 : 좋다 (0) | 2023.07.30 |
---|---|
[C++] 백준 15686번: 치킨 배달 (0) | 2023.07.30 |
[백준/C++] 2467번: 용액 (0) | 2023.07.28 |
[백준/Python] 2230 수 고르기 (0) | 2023.07.28 |
[ 백준 / Python ] #2531 회전초밥 (0) | 2023.07.27 |