본문 바로가기

알고리즘/백준

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

반응형

14499번 주사위 굴리기


1. 이해하기

  • 주사위는 지도 위에 윗 면이 1이고, 동쪽을 바라보는 방향이 3인 상태로 놓여져 있다.
  • 가장 처음에 주사위에는 모든 면에 0이 적혀져 있다.
  • 지도의 각 칸에는 정수가 하나씩 쓰여져 있다.
    • 주사위를 굴렸을 때, 이동한 칸에 쓰여있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다.
    • 주사위를 굴렸을 때, 이동한 칸에 쓰여있는 수가 0이 아니면 칸의 수가 주사위의 바닥면으로 복사되고 칸에 쓰여 있는 수는 0이 된다.
  • 주사위를 지도의 바깥으로 이동시키는 명령은 무시하며 출력도 하지 않는다.
  • 주사위가 이동할 때마다 주사위의 상단에 쓰여 있는 값을 출력하는 문제.
  • 주사위를 직접 만들어 보거나 그려서 이해하는 시뮬레이션 문제.

2. 구현하기

  • 주사위를 그려서 동쪽, 서쪽, 북쪽, 남쪽으로 이동시켰을 때 주사위의 각 면이 어떻게 이동하는지 보고 표현한다.

    void rotate(int dir) {
        if(dir == 1) {
            int temp = dice[0];
            dice[0] = dice[3];
            dice[3] = dice[5];
            dice[5] = dice[2];
            dice[2] = temp;
        } else if(dir == 2) {
            int temp = dice[0];
            dice[0] = dice[2];
            dice[2] = dice[5];
            dice[5] = dice[3];
            dice[3] = temp;
        } else if(dir == 3) {
            int temp = dice[0];
            dice[0] = dice[1];
            dice[1] = dice[5];
            dice[5] = dice[4];
            dice[4] = temp;
        } else if(dir == 4) {
            int temp = dice[0];
            dice[0] = dice[4];
            dice[4] = dice[5];
            dice[5] = dice[1];
            dice[1] = temp;
        }
    }
  • 각 명령에 맞는 방향으로 이동시켜주며 주사위 상단의 숫자를 출력한다.

    void play(int& x, int& y, int dir) {
        int nx = x+dx[dir], ny = y+dy[dir];
        if(nx < 0 or nx >= N or ny < 0 or ny >= M) return;
        rotate(dir);
        if(map[nx][ny] == 0) map[nx][ny] = dice[5];
        else {
            dice[5] = map[nx][ny];
            map[nx][ny] = 0;
        }
        cout << dice[0] << '\n';
        x = nx; y = ny;
    }

3. 전체 코드

#include <iostream>
using namespace std;
int map[20][20];
int dice[6];
int dx[] = {0,0,0,-1,1};
int dy[] = {0,1,-1,0,0};
int N,M;

void rotate(int dir) {
    if(dir == 1) {
        int temp = dice[0];
        dice[0] = dice[3];
        dice[3] = dice[5];
        dice[5] = dice[2];
        dice[2] = temp;
    } else if(dir == 2) {
        int temp = dice[0];
        dice[0] = dice[2];
        dice[2] = dice[5];
        dice[5] = dice[3];
        dice[3] = temp;
    } else if(dir == 3) {
        int temp = dice[0];
        dice[0] = dice[1];
        dice[1] = dice[5];
        dice[5] = dice[4];
        dice[4] = temp;
    } else if(dir == 4) {
        int temp = dice[0];
        dice[0] = dice[4];
        dice[4] = dice[5];
        dice[5] = dice[1];
        dice[1] = temp;
    }
}

void play(int& x, int& y, int dir) {
    int nx = x+dx[dir], ny = y+dy[dir];
    if(nx < 0 or nx >= N or ny < 0 or ny >= M) return;
    rotate(dir);
    if(map[nx][ny] == 0) map[nx][ny] = dice[5];
    else {
        dice[5] = map[nx][ny];
        map[nx][ny] = 0;
    }
    cout << dice[0] << '\n';
    x = nx; y = ny;
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);

    int sx,sy,k;
    cin >> N >> M >> sx >> sy >> 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++) {
        int dir;
        cin >> dir;
        play(sx,sy,dir);
    }
    return 0;
}

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

[백준] 14501번 퇴사  (0) 2019.10.03
[백준] 14500번 테트로미노  (0) 2019.10.03
[백준] 13458번 시험 감독  (0) 2019.10.03
[백준] 3190번 뱀  (0) 2019.10.03
[백준] 12100번 2048(Easy)  (0) 2019.10.03