본문 바로가기

Programming/BOJ Solutions

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

시간 제한메모리 제한제출정답맞은 사람정답 비율
2 초512 MB72312632197838.535%

문제

크기가 N×M인 지도가 존재한다. 지도의 오른쪽은 동쪽, 위쪽은 북쪽이다. 이 지도의 위에 주사위가 하나 놓여져 있으며, 주사위의 전개도는 아래와 같다. 지도의 좌표는 (r, c)로 나타내며, r는 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로부터 떨어진 칸의 개수이다. 

  2
4 1 3
  5
  6

주사위는 지도 위에 윗 면이 1이고, 동쪽을 바라보는 방향이 3인 상태로 놓여져 있으며, 놓여져 있는 곳의 좌표는 (x, y) 이다. 가장 처음에 주사위에는 모든 면에 0이 적혀져 있다.

지도의 각 칸에는 정수가 하나씩 쓰여져 있다. 주사위를 굴렸을 때, 이동한 칸에 써 있는 수가 0이면, 주사위의 바닥면에 써 있는 수가 칸에 복사된다. 0이 아닌 경우에는 칸에 써 있는 수가 주사위의 바닥면으로 복사되며, 칸에 써 있는 수는 0이 된다.

주사위를 놓은 곳의 좌표와 이동시키는 명령이 주어졌을 때, 주사위가 이동했을 때 마다 상단에 써 있는 값을 구하는 프로그램을 작성하시오.

주사위는 지도의 바깥으로 이동시킬 수 없다. 만약 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안된다.

입력

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다.

둘째 줄부터 N개의 줄에 지도에 써 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 써 있는 수는 항상 0이다. 지도의 각 칸에 써 있는 수는 10을 넘지 않는 자연수이다.

마지막 줄에는 이동하는 명령이 순서대로 주어진다. 동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4로 주어진다.

출력

이동할 때마다 주사위의 윗 면에 써 있는 수를 출력한다. 만약 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안된다.

예제 입력 1 

4 2 0 0 8
0 2
3 4
5 6
7 8
4 4 4 1 3 3 3 2

예제 출력 1 

0
0
3
0
0
8
6
3

예제 입력 2 

3 3 1 1 9
1 2 3
4 0 5
6 7 8
1 3 2 2 4 4 1 1 3

예제 출력 2 

0
0
0
3
0
1
0
6
0

예제 입력 3 

2 2 0 0 16
0 2
3 4
4 4 4 4 1 1 1 1 3 3 3 3 2 2 2 2

예제 출력 3 

0
0
0
0

예제 입력 4 

3 3 0 0 16
0 1 2
3 4 5
6 7 8
4 4 1 1 3 3 2 2 4 4 1 1 3 3 2 2

예제 출력 4 

0
0
0
6
0
8
0
2
0
8
0
2
0
8
0
2

삼성 S/W테스트 기출문제이고, 시뮬레이션을 이용해서 푼 문제이다.


조건들만 잘 고려하면 풀리는 문제이다.


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
#include <iostream>
 
using namespace std;
 
int main() {
 
    int dice[7= {0};
    int map[20][20], N, M, x, y, K;
    int i, j, direction[1000];
    bool yes = true;
 
    cin >> N >> M >> x >> y >> K;
 
    for (i = 0; i < N; i++) {
        for (j = 0; j < M; j++) {
            cin >> map[i][j];
        }
    }
 
    for (i = 0; i < K; i++) {
        cin >> direction[i];
    }
 
    for (i = 0; i < K; i++) {
        yes = true;
 
        switch (direction[i]) {
            case 1:
                if (y + 1 <= M - 1) {
                    y++;
 
                    dice[0= dice[1];
 
                    dice[1= dice[4];
                    dice[4= dice[6];
                    dice[6= dice[3];
                    dice[3= dice[0];
 
                    if (map[x][y] == 0) map[x][y] = dice[6];
                    else {
                        dice[6= map[x][y];
                        map[x][y] = 0;
                    }
                } else yes = false;
 
                break;
 
            case 2:
                if (y - 1 >= 0) {
                    y--;
 
                    dice[0= dice[1];
 
                    dice[1= dice[3];
                    dice[3= dice[6];
                    dice[6= dice[4];
                    dice[4= dice[0];
 
                    if (map[x][y] == 0) map[x][y] = dice[6];
                    else {
                        dice[6= map[x][y];
                        map[x][y] = 0;
                    }
 
                } else yes = false;
 
                break;
 
            case 3:
                if (x - 1 >= 0) {
                    x--;
 
                    dice[0= dice[1];
 
                    dice[1= dice[5];
                    dice[5= dice[6];
                    dice[6= dice[2];
                    dice[2= dice[0];
 
                    if (map[x][y] == 0) map[x][y] = dice[6];
                    else {
                        dice[6= map[x][y];
                        map[x][y] = 0;
                    }
                } else yes = false;
 
                break;
 
            case 4:
                if (x + 1 <= N - 1) {
                    x++;
 
                    dice[0= dice[1];
 
                    dice[1= dice[2];
                    dice[2= dice[6];
                    dice[6= dice[5];
                    dice[5= dice[0];
 
                    if (map[x][y] == 0) map[x][y] = dice[6];
                    else {
                        dice[6= map[x][y];
                        map[x][y] = 0;
                    }
 
                } else yes = false;
 
                break;
 
            default:
                yes = false;
 
        }
 
        if (yes == truecout << dice[1<< endl;
 
    }
 
    return 0;
}
cs


'Programming > BOJ Solutions' 카테고리의 다른 글

[백준 15686번] 치킨배달  (0) 2018.06.20
[백준 14502번] 연구소  (0) 2018.06.20
[백준 1405번] 미친 로봇  (0) 2018.06.19
[백준 13458번] 시험 감독  (0) 2018.06.19
[백준 1260번] DFS와 BFS  (0) 2018.06.19