# 백준 : 주사위 굴리기(14499)

문제

https://www.acmicpc.net/problem/14499

소스

(Github: https://github.com/wonjnlee/wallydev/blob/master/bj_14499_dice)

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <cstring>
#include <list>
#include <cmath>
using namespace std;

int N, M, x, y, temp;
int _up = 0; int _down = 0; int _left = 0; int _right = 0; int _front = 0; int _back = 0;
void east(); void west(); void south(); void north(); void check_print();
int map[20][20];
int command[1000];

int main(void)
{
    int K;
    cin>>N>>M>>x>>y>>K;
    // Build Map
    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>>command[i];
    
    // Command operations
    for(int i=0; i<K; i++) {
        if((command[i] == 1) && (y < M - 1))        east();
        else if((command[i] == 2) && (y > 0))       west();
        else if((command[i] == 3) && (x > 0))       north();
        else if((command[i] == 4) && (x < N - 1))   south();
    }
    return 0;
}

void check_print() {
    if(map[x][y]) {
        _down = map[x][y];
        map[x][y] = 0;
    }
    else {
        map[x][y] = _down;
    }
    cout<<_up<<endl;

}

void east() {
    y       += 1;
    temp    = _left;
    _left   = _up;
    _up     = _right;
    _right  = _down;
    _down   = temp;
    check_print();
}

void west() {
    y       -= 1;
    temp    = _right;
    _right  = _up;
    _up     = _left;
    _left   = _down;
    _down   = temp;
    check_print();
}

void south() {
    x       += 1;
    temp    = _front;
    _front  = _up;
    _up     = _back;
    _back   = _down;
    _down   = temp;
    check_print();
}

void north() {
    x       -= 1;
    temp    = _back;
    _back   = _up;
    _up     = _front;
    _front  = _down;
    _down   = temp;
    check_print();
}

풀이

생각보다 코드가 매우 긴데, 문제가 이런식으로 경우의 수를 모두 따져봐야 했으므로..
무튼 이 문제는 몇 가지 함정(?)을 포함한다.

1. 주사위 도면을 그려주고 이것을 이용해야 하는 것처럼 하지만, 실제로는 '위, 아래, 앞, 뒤, 왼쪽, 오른쪽'만 확인하면 되므로 신경쓰지 않아도 됨.

2. x, y가 우리가 평상시에 생각하던대로 하면 안됨.. 문제를 잘 읽어보면 우리가 일반적으로 사용하는 것 처럼 (y, x)가 아니라 (x, y)임. 즉 세로의 위치를 확인하는 것이 x고 가로의 위치를 확인하는 것이 y임.
무튼 이 두가지가 굉장히 '귀찮게' 만드는 원인들이었는데, 문제가 틀렸다고 생각하지 말고 그냥 문제 그대로 풀어버리면 되는거라.. (날 믿어라 이건가)

각 상황별로 동서남북에 맞게 이동시키도록 하였고, 주사위의 위치들은 전역변수로 두고 구했다.
꽤 쉽게 구했는데 왜 이게 정답률이 30%대인지는 생각해볼 부분.

댓글