본문 바로가기

개발/알고리즘

백준 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

 

해당 문제는 시뮬레이션 유형으로 주사위를 동 / 서 / 남 / 북 으로 굴릴 때 어떻게 표현해야할지가 핵심이었던 문제이다.

초기 주사위값을 이용하여 동 / 서 / 남 / 북으로 주사위를 굴릴 때 변화하는 값을 아래 그림에 표현하였다.

이를 dice 배열에 담아주었고, 각 direction 에 맞게 주사위의 값을 갱신해주었다.

 

코드

#include <iostream>
#include <vector>

using namespace std;

int n, m, y, x, k, a[20][20], dice[7], dy[] = { 0, 0, -1, 1}, dx[] = { 1, -1, 0, 0 };

void diceMove(int dir)
{
    if(dir == 0){ //동 == right
        int temp = dice[1];
        dice[1] = dice[4];
        dice[4] = dice[6];
        dice[6] = dice[3];
        dice[3] = temp;
        } else if (dir == 1) { //서 == left
        int temp = dice[1];
        dice[1] = dice[3];
        dice[3] = dice[6];
        dice[6] = dice[4];
        dice[4] = temp;
        } else if (dir == 2) { // 북 == up
        int temp = dice[1];
        dice[1] = dice[5];
        dice[5] = dice[6];
        dice[6] = dice[2];
        dice[2] = temp;
        } else { //남 == down
        int temp = dice[1];
        dice[1] = dice[2];
        dice[2] = dice[6];
        dice[6] = dice[5];
        dice[5] = temp;
    }
}

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

    cin >> n >> m >> y >> x >> k;
    for(int i = 0; i < n; i++){
        for(int j= 0; j < m; j++){
            cin >> a[i][j];
        }
    }
    int ny = 0, nx = 0;
    while(k--){
        int dir;
        cin >> dir;
        dir--;
        ny = y + dy[dir];
        nx = x + dx[dir];

        if(ny < 0 || ny >= n || nx < 0 || nx >= m)
            continue;

        diceMove(dir);
        
        y = ny;
        x = nx;
        if(a[y][x] == 0) {
            a[y][x] = dice[6];
        } else {
            dice[6] = a[y][x];
            a[y][x] = 0;
        }
        cout << dice[1] << "\n";
    }
	return 0;
}