Algorithm/BOJ

[백준 14499] 주사위 굴리기 C++

Henu 2021. 5. 8. 19:14
 

14499번: 주사위 굴리기

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

www.acmicpc.net

삼성 SW 역량 테스트 기출 문제

주사위가 굴러가는걸 내가 어떻게 아냐고..

라고 처음에 생각했었는데

생각보다 할 만했던 문제였다

삼성 역량평가는 물체가 좌표상에서 움직이는 시뮬레이션 문제가 정말 주된 유형인듯하다

 

주사위가 굴러가는걸 어떻게 표현할까?

 

문제에 그려져 있는 주사위 평면도를 보고 풀이방법을 떠올릴 수 있었다.. 저게 없었으면 못풀었을지도

 

dice[i] 는 i번 면에 적힌 숫자를 의미한다

dice_idx[i]는 i면(윗면, 바닥면, 옆면 등...)에 위치한 dice의 면 번호 

  • dice_idx[1] : 바닥 면에 mapping된 dice 의 면
  • dice_idx[6]: 윗면에 mapping된 dice 의 면

아래 코드의 핵심은 Move 함수이다

주사위의 이동 방향에 따라서 현재 윗 면, 아랫 면 등에 위치한 dice의 면 번호를 갱신해줌!

 

Move 함수를 실행 시킨 후 현재 윗면의 숫자를 알고 싶으면 dice[dice_idx[6]] 에 있는 숫자를 읽어보면 된다

 

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
#include <bits/stdc++.h>
 
using namespace std;
 
int N, M, x, y, K, nowr, nowc;
int Map[21][21];
// 동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4
int Operation[1001];
 
// 아래면 : 1, 북쪽으로가는면 : 2, 동쪽으로가는면 : 3, 서쪽으로가는면 : 4, 남쪽으로가는면 : 5, 현재윗면 : 6
int dice_idx[7= {0,1,2,3,4,5,6};
int dice[7];
int dr[5= {000-11}, dc[5= {01-100};
 
void Move(int op){
    int temp = dice_idx[1];
    switch (op){
        case 1
            dice_idx[1= dice_idx[3];
            dice_idx[3= dice_idx[6];
            dice_idx[6= dice_idx[4];
            dice_idx[4= temp;
            break;
            
        case 2:
            dice_idx[1= dice_idx[4];
            dice_idx[4= dice_idx[6];
            dice_idx[6= dice_idx[3];
            dice_idx[3= temp;
            break;
        
        case 3:
            dice_idx[1= dice_idx[2];
            dice_idx[2= dice_idx[6];
            dice_idx[6= dice_idx[5];
            dice_idx[5= temp;
            break;
            
        case 4:
            dice_idx[1= dice_idx[5];
            dice_idx[5= dice_idx[6];
            dice_idx[6= dice_idx[2];
            dice_idx[2= temp;
            break;
        
        defaultbreak;
    }
}
 
void solve(){
    int r = x;
    int c = y;
    for(int i = 0; i < K; i++){
        int nr = r + dr[Operation[i]];
        int nc = c + dc[Operation[i]];
        if(nr >= N || nr < 0 || nc >= M || nc < 0continue;
        Move(Operation[i]);
        if(Map[nr][nc] == 0){
            Map[nr][nc] = dice[dice_idx[1]];
        }
        else{
            dice[dice_idx[1]] = Map[nr][nc];
            Map[nr][nc] = 0;
        }
        cout << dice[dice_idx[6]] << "\n";
        r = nr;
        c = nc;
    }
}
 
void input(){
    cin >> N >> M >> x >> y >> K;
    
    for(int i = 0; i < N; i++){
        for(int j = 0; j < M; j++){
            cin >> Map[i][j];
        }
    }
    for(int i = 0; i < K; i++){
        cin >> Operation[i];
    }
}
 
int main(){
    input();
    solve();
    
    return 0;
}
cs

시뮬레이션