# 백준 : 주사위 굴리기(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%대인지는 생각해볼 부분.
댓글
댓글 쓰기