아무코딩

[백준 14499] 주사위 굴리기 본문

알고리즘/백준

[백준 14499] 주사위 굴리기

동 코 2020. 5. 6. 15:53

문제풀이

동, 서, 남, 북 4가지 케이스로 움직이는 경우에 따라 면이 바뀌는 경우를 다 정해주는 방식으로 코딩하였다.

회전 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
#include <stdio.h>
 
typedef struct Dice {
    int up;
    int down;
    int left;
    int right;
    int front;
    int back;
}Dice;
 
Dice dice;
int N, M, x, y, K;
int Map[20][20];
int inst;
int dir_x[4= {0,0,-1,1};
int dir_y[4= {1,-1,0,0};
void move_Dice(int dir);
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"&Map[i][j]);
        }
    }
    for (int i = 0; i < K; i++) {
        scanf("%d"&inst);//동 1 서 2 북 3 남 4
        move_Dice(inst-1);
    }
}
 
void move_Dice(int dir) {
    int next_x, next_y,temp;
    next_x = x + dir_x[dir];
    next_y = y + dir_y[dir];
 
    if (next_x < 0 || next_y < 0 || next_x >= N || next_y >= M)
        return;
    x = next_x;
    y = next_y;
    switch (dir) {
    case 0://동
        temp = dice.down;
        dice.down = dice.right;
        dice.right = dice.up;
        dice.up = dice.left;
        dice.left = temp;
        break;
    case 1://서
        temp = dice.down;
        dice.down = dice.left;
        dice.left = dice.up;
        dice.up = dice.right;
        dice.right = temp;
        break;
    case 2://북
        temp = dice.down;
        dice.down = dice.back;
        dice.back = dice.up;
        dice.up = dice.front;
        dice.front = temp;
        break;
    case 3://남
        temp = dice.down;
        dice.down = dice.front;
        dice.front = dice.up;
        dice.up = dice.back;
        dice.back = temp;
        break;
    }
    if (Map[x][y] == 0)
        Map[x][y] = dice.down;
    else {
        dice.down = Map[x][y];
        Map[x][y] = 0;
    }
    
    printf("%d\n"dice.up);
}
 
 
 

문제 링크 : 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

 

'알고리즘 > 백준' 카테고리의 다른 글

[백준 1300] k번째수  (0) 2020.05.08
[백준 2252] 줄세우기  (0) 2020.05.08
[백준 14888] 연산자 끼워넣기  (0) 2020.04.28
[백준 2573] 빙산  (0) 2020.04.27
[백준 11559] Puyo Puyo  (0) 2020.04.25
Comments