본문 바로가기
Programming/Algorithm

백준 주사위 던지기

by OKOK 2018. 2. 21.

/*

크기가 엔엠인 지도가 있습니다. 주사위의 전개도는 아래와 같습니다.

지도의 좌표는 알씨로 나타내며 으로부터 떨어진 칸의 개수 이므로

인데스 0부터 시작해도 상관없습니다.

주사위는 지도 위에 윗 면이 1이고, 동쪽을 바라보는 방향이 3인 상태입니다. 


1. 가장 처음에 주사위에는 모든 면이 0이 적혀져 있습니다.


주사위를 굴립니다.

1. 이동한 칸에 써 있는 수가 0 이면, 주사위의 바닥면에 써 있는 수가 칸에 복사

0이 아닌 경우, 칸 - > 주사위,  칸에 써 있는 수가 0 이 됩니다.


놓은 곳의 좌표와 이동시키는 명령이 주어졌을 떄, 상단에 써 있는 값을 구하는 프로그램

바깥으로 이동시키려는 경우 -> 해당 명령을 무시, contiune 를 넣으면 됩니다.


동 서 북 남의 순서로 돌아가게 됩니다.

남남남 동 북북북 서


먼저 주사위에 대한 어레이를 하나 만들도록 하겠습니다.

0123456 이렇게 만들어서 사용하도록 하겠습니다.


1. 돌리는 함수

dice 배열을 원래 인덱스로 고정시키고 값을 변경합니다.

그래야 바닥면과 윗면에 대한 것을 1과 6으로 고정하고 파악이 가능합니다. 



2. 검사하는 함수


디버깅을 할 때 어떻게 해야하는가? 어떤 지금 예외처리에 대해서 모르기 때문에,

정답이 다르게 나오고 있습니다. 


동 서 북 남 이므로

9 가지 입니다.

동 북 서 서 남 남 동 동 북 




*/


#include <iostream>

#define SIZE 5

using namespace std;


int n, m, x, y, k, nx, ny;

int map[SIZE][SIZE];

int dir_info[1001];

int dx[] = {0,0,-1,1};

int dy[] = {1,-1,0,0}; // 동 서 북 남

int dice[7] = { 0, }; // 초기에는 주사위 모든 방향이 0 으로 설정되어 있음.

int d;


void problemIn() {

cin >> n >> m >> x >> y >> 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++) {

cin >> dir_info[i];

}

}


void turn(int d) {

int temp;


switch (d) {

case 1: // 동

y += 1;

if (y >= m) { y -= 1; break; } // 2를 넘어가면 무시,

temp = dice[3];

dice[3] = dice[6];

dice[6] = dice[4];

dice[4] = dice[1];

dice[1] = temp;

if (map[x][y] == 0) map[x][y] = dice[1];

else { dice[1] = map[x][y]; map[x][y] = 0; }

cout << dice[6] << endl;

break;


case 2: // 서

y -= 1;

if (y < 0) { y += 1; break; }

temp = dice[6];

dice[6] = dice[3];

dice[3] = dice[1];

dice[1] = dice[4];

dice[4] = temp;

if (map[x][y] == 0) map[x][y] = dice[1];

else { dice[1] = map[x][y]; map[x][y] = 0; }

cout << dice[6] << endl;

break;


case 3: // 북

x -= 1;

if (x < 0) { x += 1; break; }

temp = dice[6];

dice[6] = dice[5];

dice[5] = dice[1];

dice[1] = dice[2];

dice[2] = temp;

if (map[x][y] == 0) map[x][y] = dice[1];

else { dice[1] = map[x][y]; map[x][y] = 0; }

cout << dice[6] << endl;

break;


case 4: // 남

x += 1;

if (x >= n) { x -= 1; break; }

temp = dice[5];

dice[5] = dice[6];

dice[6] = dice[2];

dice[2] = dice[1];

dice[1] = temp;

if (map[x][y] == 0) map[x][y] = dice[1];

else { dice[1] = map[x][y]; map[x][y] = 0; }

cout << dice[6] << endl;

break;

}

}

/*

바깥으로 이동시키는지에 대해서 살펴볼 필요가 있습니다.

*/


void solve() {

// dice[1] = map[x][y]; // 처음 맵에 위치할때 맵의 수를 주사위에 복사하기.

for (int i = 0; i < k; i++) { // 명령어 갯수 만큼 반복합니다.

d = dir_info[i];

turn(d);

}

return;

}



int main(void) {

problemIn();

solve();

return 0;


백준 주사위 던지기. 문제 스스로 풀었지만 시간이 약 2시간 30분 소요됬습니다. 아이디어에 대해서는 알고 있었으나, 세부적인 구현에서 시간을 많이 사용했습니다.


먼저 정확하게 굴렸을때, 어떻게 변화되는지, temp 의 순서를 정확하게 넣었는지 에 대해서 1차

2번째는 이상할때, 맵을 벗어날때, 되돌아 오는 코드를 넣어주지 않아서 틀렸습니다.


명확하게 함수에 대해서 기능을 정의하고 어떻게 돌아오게 할 것인지에 대해서도 적어두도록 합니다.

이것도 다른 알고리즘이 아닌 시뮬레이션 문제였습니다. 오께이. 


백준 기출중에 경사로 문제와 째로 탈출에 대해서 풀어보도록 하겠습니다. 오께이.