티스토리 뷰

[백준 14499번 주사위 굴리기 URL]



이번 문제는, 규칙성을 찾아내는 문제이다.

문제에서 보는 것처럼, 초기 주사위의 위치와 그 값을 배열로 나타낼 경우 아래와 같이 나타낼 수 있다.

이 상태에서 주사위를 동쪽으로 2번 굴렸을 때를 생각해보자. 아래 그림과 같이 나타낼 수 있다.

초기 단계에서 동쪽으로 굴리면 [뒷면, 앞면]을 제외한 나머지 면들이 변화하는 것을 볼 수 있다.

하지만 변화할 때 위에서 보는 것처럼 규칙성을 가지고 변화한다.

1) 바닥면은  왼쪽면으로

2) 왼쪽면은 윗면으로

3) 오른쪽면은 바닥면으로

4) 윗면은 오른쪽면으로

바뀌는 것을 볼 수 있다.


이 규칙성은 주사위를 동쪽으로 굴렸을 경우에만 해당하는 것이기 때문에 서쪽, 남쪽, 북쪽도 마찬가지로

규칙성을 찾아 문제를 풀면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;
 
public class Main {
 
    public static int N, M, K, row, col;
    public static int[][] map;
    public static int[] dice = new int[6];
    public static boolean[][] visited;
    public static int[] dirX = new int[] { 00-11 };
    public static int[] dirY = new int[] { 1-100 };
    public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
    public static void main(String[] args) throws Exception {
 
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        row = Integer.parseInt(st.nextToken());
        col = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());
 
        map = new int[N][M];
        visited = new boolean[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());
 
        while (st.hasMoreTokens()) {
            int dir = Integer.parseInt(st.nextToken());
            doDice(dir - 1);
        }
    }
 
    public static void doDice(int dir) {
 
        int nr = row + dirX[dir];
        int nc = col + dirY[dir];
 
        if (isBoundary(nr, nc)) {
 
            rollDice(dir);
 
            if (map[nr][nc] == 0) {
                map[nr][nc] = dice[5];
            } else {
                dice[5= map[nr][nc];
                map[nr][nc] = 0;
            }
            System.out.println(dice[0]);
            row = nr;
            col = nc;
        }
    }
 
    public static void rollDice(int dir) {
 
        int[] temp = Arrays.copyOf(dice, dice.length);
        switch (dir) {
        case 0:
            dice[0= temp[3];
            dice[2= temp[0];
            dice[3= temp[5];
            dice[5= temp[2];
            break;
        case 1:
            dice[0= temp[2];
            dice[2= temp[5];
            dice[3= temp[0];
            dice[5= temp[3];
            break;
        case 2:
            dice[0= temp[4];
            dice[1= temp[0];
            dice[4= temp[5];
            dice[5= temp[1];
            break;
        case 3:
            dice[0= temp[1];
            dice[1= temp[5];
            dice[4= temp[0];
            dice[5= temp[4];
            break;
        }
 
    }
 
    public static boolean isBoundary(int row, int col) {
        return (row >= 0 && row < N) && (col >= 0 && col < M);
    }
 
}
 
class Node {
    int row;
    int col;
 
    public Node(int row, int col) {
        this.row = row;
        this.col = col;
    }
 
}
 
cs






댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함