Suhwanc

문제 링크 : https://www.acmicpc.net/problem/14499

 

14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다. 마

www.acmicpc.net

풀이

시뮬레이션 문제입니다!

시뮬레이션 문제답게 이 문제는 주사위를 구현하는 문제이다.

다행히 이 문제에서 주사위는 동, 서, 남, 북으로 딱 한 번만 구르기 때문에 

각각의 상황에서 주사위가 어떻게 구르는지를 생각하면 되겠다. (실제로 만들어서 굴려봐도 좋습니다!)

나는 위 주사위 모형에 대해 각각 up,down,동,서,남,북 면으로 생각했고,

이 원소들을 포함한 주사위 배열을 만들었다.

이럴 때 동,서,남,북 각각의 구르기에 대한 주사위 면의 변화는 이렇다

  • case1. 동쪽 구르기 : up -> 동쪽면, down -> 서쪽면, 동쪽면 -> down, 서쪽면 -> up
  • case 2. 서쪽 구르기 : up -> 서쪽면, down -> 동쪽면, 동쪽면 -> up, 서쪽면 -> down
  • case 3. 북쪽 구르기: up -> 북, down -> 남, 북 -> down, 남 -> up
  • case4. 남쪽 구르기 : up -> 남, down -> 북, 북 -> up, 남 -> down

이에 대한 함수를 만들어서 따라서 이동시키는 명령에 따라 구르도록 설정하였다.

추가로 풀다가 빠뜨린 조건이 있었는데 문제를 잘 보면

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

여기서 칸에 쓰여있는 수가 0이 된다는 부분도 구현해주어야 한다. 

 

위와 같이 시뮬레이션 문제는 문제에 나와있는 조건을 반드시 모두 구현해주어야 한다.

 

소스 코드

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
#include <iostream>
#include <vector>
using namespace std;
 
int board[20][20];
int x, y;
int k;
int n, m;
int dice[6]; // up, down, 동, 서, 북, 남 순서대로
void turn_east() {
    int temp_dice[6= { 0, };
    temp_dice[2= dice[0];
    temp_dice[3= dice[1];
    temp_dice[1= dice[2];
    temp_dice[0= dice[3];
    for (int i = 0; i < 4; i++) {
        dice[i] = temp_dice[i];
    }
}
void turn_west() {
    int temp_dice[6= { 0, };
    temp_dice[3= dice[0];
    temp_dice[2= dice[1];
    temp_dice[1= dice[3];
    temp_dice[0= dice[2];
    for (int i = 0; i < 4; i++) {
        dice[i] = temp_dice[i];
    }
}
void turn_north() {
    int temp_dice[6= { 0, };
    temp_dice[4= dice[0];
    temp_dice[5= dice[1];
    temp_dice[1= dice[4];
    temp_dice[0= dice[5];
    temp_dice[2= dice[2]; temp_dice[3= dice[3];
    for (int i = 0; i < 6; i++) {
        dice[i] = temp_dice[i];
    }
}
void turn_south() {
    int temp_dice[6= { 0, };
    temp_dice[4= dice[1];
    temp_dice[5= dice[0];
    temp_dice[1= dice[5];
    temp_dice[0= dice[4];
    temp_dice[2= dice[2]; temp_dice[3= dice[3];
    for (int i = 0; i < 6; i++) {
        dice[i] = temp_dice[i];
    }
}
cs

위 코드가 구르기를 구현한 코드이다

 

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
int main()
{
    scanf("%d %d %d %d %d"&n, &m, &x, &y, &k);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%d"&board[i][j]);
        }
    }
 
    for (int i = 0; i < k; i++) {
        int cmd; scanf("%d"&cmd);
        if (cmd == 1) { //동쪽
            if (y + 1 == m) continue;
            else {
                //주사위 회전
                turn_east();
                y++;
                if (board[x][y] == 0) {
                    board[x][y] = dice[1];
                }
                else {
                    dice[1= board[x][y];
                    board[x][y] = 0;
                }
            }
        }
        else if (cmd == 2) { //서쪽
            if (y == 0continue;
            else {
                //주사위 회전
                turn_west();
                y--;
                if (board[x][y] == 0) {
                    board[x][y] = dice[1];
                }
                else {
                    dice[1= board[x][y];
                    board[x][y] = 0;
                }
            }
        }
cs
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
else if (cmd == 3) { //북쪽
            if (x == 0continue;
            else {
                //주사위 회전
                turn_north();
                x--;
                if (board[x][y] == 0) {
                    board[x][y] = dice[1];
                }
                else {
                    dice[1= board[x][y];
                    board[x][y] = 0;
                }
            }
        }else if (cmd == 4) { //남쪽
            if (x+1 == n) continue;
            else {
                //주사위 회전
                turn_south();
                x++;
                if (board[x][y] == 0) {
                    board[x][y] = dice[1];
                }
                else {
                    dice[1= board[x][y];
                    board[x][y] = 0;
                }
            }
        }
        printf("%d\n", dice[0]);
    }
    return 0;
}
cs

환경 : Visual Studio 2019

지적, 조언 및 질문 감사합니다!

'백준 문제풀이' 카테고리의 다른 글

백준 2252번 줄 세우기  (0) 2020.02.12
백준 14503번 로봇 청소기  (0) 2020.01.27
백준 15658번 연산자 끼워넣기 2  (0) 2020.01.20
백준 1248번 맞춰봐  (0) 2020.01.20
백준 15661번 링크와 스타트  (0) 2020.01.20