코딩스토리

백준 14499번 - 주사위 굴리기 본문

알고리즘/삼성 SW 역량테스트 기출 문제

백준 14499번 - 주사위 굴리기

kimtaehyun98 2020. 8. 6. 14:49

백준 14499번 - 주사위 굴리기

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개의 줄에 지도

www.acmicpc.net

 

이 문제는 시뮬레이션 문제이다.

주사위를 지도 안에서 굴리면서 윗면(바닥 면과 반대되는 면)을 출력하는 문제이다. 

조건은 다음과 같다.

 

  1. 주사위를 굴렸을 때, 이동한 칸에 쓰여있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다.
  2. 0 이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며, 칸에 쓰여 있는 수는 0이 된다.
  3. 주사위는 지도 바깥으로 이동 불가하며 입력이 들어올 시 해당 입력 무시 및 출력 X

풀이법은 각 이동마다 주사위의 모든 면을 갱신시켜주는 것이 핵심이였다.

구현은 switch문을 통해 동, 서, 남, 북 이동시마다 주사위의 숫자들을 갱신시켰다.

방법은 예를 들어 동쪽으로 이동 시 (바닥면 기준 동,서,남,북 면으로 표현하였다)

 

바닥면 -> 기존 바닥면의 동쪽 면

윗면 -> 기존 바닥면의 서쪽 면

동쪽 면 -> 기존 바닥면의 윗 면

서쪽면 -> 기존 바닥면

남쪽 면 -> 기존 남쪽면

북쪽 면 -> 기존 북쪽면

 

이렇게 동, 서, 남, 북으로 이동 시 바뀌는 면들을 코드로 구현하였다.

처음에 문제에서 동, 서, 북, 남 순으로 제시했는데 잘못 읽어서 동, 서, 남, 북으로 표현했다가 시간을 낭비했다.

그리고 질문 검색판을 읽어보니 대부분의 틀린 사람들이 입력 받을 때 x,y를 반대로 입력 받지 않아서 틀렸다고 하던데

나는 처음부터 행렬로 생각하고 풀었기 때문에 x, y 입력에는 문제가 없었다.

(왜 y,x로 입력받아야 되는지 아직도 모르겠음 ㅎㅎ..)

 

코드는 다음과 같다.

 

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
#include <iostream>
#include <vector>
#pragma warning(disable:4996)
using namespace std;
int map[21][21];
int dx[4= { 0,0-11 };
int dy[4= { 1,-1,0,0 };
 
int main() {
    int n, m, x, y, k;
    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]);
        }
    }
    vector<int>move(k);
    for (int i = 0; i < k; i++) {
        scanf("%d"&move[i]);
    }
    int cen = 0, north = 0, south = 0, east = 0, west = 0, top = 0;
    int nx = x, ny = y;
    for (int i = 0; i < k; i++) {
        int now = move[i];
        nx = nx + dx[now - 1];
        ny = ny + dy[now - 1];
        if (nx < 0 || nx >= n || ny < 0 || ny >= m) {
            nx = nx - dx[now - 1];
            ny = ny - dy[now - 1];
            continue;
        }
        int prev_cen = cen, prev_north = north, prev_south = south;
        int prev_east = east, prev_west = west, prev_top = top;
        switch (now) {
            case 1:
                cen = prev_east;
                west = prev_cen;
                east = prev_top;
                top = prev_west;
                break;
            case 2:
                cen = prev_west;
                west = prev_top;
                east = prev_cen;
                top = prev_east;
                break;
            case 3:
                cen = prev_north;
                north = prev_top;
                south = prev_cen;
                top = prev_south;
                break;
            case 4:
                cen = prev_south;
                north = prev_cen;
                south = prev_top;
                top = prev_north;
                break;
        }
        if (map[nx][ny] == 0) map[nx][ny] = cen;
        else {
            cen = map[nx][ny];
            map[nx][ny] = 0;
        }
        printf("%d\n", top);
    }
}
cs

 

동, 서, 남, 북으로 이동 했을 때의 각 면의 숫자들의 변화만 잘 생각해서 짜면 쉽게 풀 수 있을 것이다.

Comments