문제 출처: https://www.acmicpc.net/problem/14499


풀이

푸는데 2시간넘게걸린 문제입니다. 주사위가 돌아갈 때를 머릿속으로 그릴줄 알고 어느정도 공간감각력이 필요한 것 같습니다.

이 문제의 핵심은 주사위를 굴릴 때, 변화하는 주사위의 위치를 본인이 기준을 세워서 그 기준안에서 돌아가게끔 해야하는것입니다.

저는 문제에서 보기로 주어진 평면도를 기준으로삼았습니다.

즉, 보기의 평면도를 주사위로접으면, 아래 그림처럼 됩니다. 이 기준을 삼아서 최종적으로 dice[6](윗면)가 답으로 출력되게끔했습니다.


위의 평면도 상에서, 주사위를 동,서,남,북 방향으로 돌려보면, 규칙이 보입니다.(규칙이라기보단 당연한 내용입니다.)

동쪽, 서쪽 으로 돌리면, 2,5번 면은 움직이지 않고, 북쪽,남쪽으로 돌리면 3,4번 면은 움직이지않습니다.

이렇듯, 한번 돌리고 나서 변화하는 위치를 기억하기 위해 주사위의 복사본으로 변화하는 좌표를 담고, 기존 주사위를 변화할 수 있게 합니다.

이처럼, 본인이 삼은 위치의 변화의 기준을 이용하여 문제에 맞게 코드를 작성하면됩니다.


주의사항

이 부분 때문에 오래걸렸는데, 문제에서 지도의 좌표(r,c)는, 입력받을 (y,x)와 동일하기 때문에, x,y순이 아닌 y,x순으로 입력을 해야합니다.

(이걸로 틀리게하는건 좀 유치하다고생각하는데...)


코드

#include<iostream>
using namespace std;
int dice[7];
int temp[7];

int map[21][21];
int main()
{
	cin.tie(0);
	cin.sync_with_stdio(false);
	int n, m, y, x, k, call;
	cin >> n >> m >> y >> x >> 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 >> call;
		if (call == 1)
		{
			if (x+1<m)
			{
				x = x + 1;
				temp[4] = dice[4];
				temp[1] = dice[1];
				temp[3] = dice[3];
				temp[6] = dice[6];


				dice[4] = temp[1];
				dice[1] = temp[3];
				dice[3] = temp[6];
				dice[6] = temp[4];
				if (map[y][x ] == 0)
				{
					map[y][x ] = dice[1];
				}
				else
				{
					dice[1] = map[y][x ];
					map[y][x ] = 0;
				}
				cout << dice[6] << endl;
			}
		}
		else if (call == 2)
		{
			if (x - 1 >= 0)
			{
				x = x - 1;
				temp[4] = dice[4];
				temp[1] = dice[1];
				temp[3] = dice[3];
				temp[6] = dice[6];


				dice[4] = temp[6];
				dice[1] = temp[4];
				dice[3] = temp[1];
				dice[6] = temp[3];
				if (map[y][x ] == 0)
				{
					map[y][x ] = dice[1];
				}
				else
				{
					dice[1] = map[y][x ];
					map[y][x ] = 0;
				}
				cout << dice[6] << endl;
			}		
		}
		else if (call == 3)
		{
			if (y - 1 >= 0)
			{
				y = y - 1;
				temp[2] = dice[2];
				temp[1] = dice[1];
				temp[5] = dice[5];
				temp[6] = dice[6];

				dice[2] = temp[6];
				dice[1] = temp[2];
				dice[5] = temp[1];
				dice[6] = temp[5];

					if (map[y][x] == 0)
					{
						map[y][x] = dice[1];
					}
					else
					{
						dice[1] = map[y][x ];
						map[y][x ] = 0;
					}
				cout << dice[6] << endl;
			}
		}
		else if (call == 4)
		{
			if (y + 1 <n)
			{
				y = y + 1;
				temp[2] = dice[2];
				temp[1] = dice[1];
				temp[5] = dice[5];
				temp[6] = dice[6];

				dice[2] = temp[1];
				dice[1] = temp[5];
				dice[5] = temp[6];
				dice[6] = temp[2];
				if (map[y][x] == 0)
				{
					map[y ][x] = dice[1];
				}
				else
				{
					dice[1] = map[y][x];
					map[y ][x] = 0;
				}
				cout << dice[6] << '\n';
			}
		}
	}
}


결과







'문제풀이(BOJ) > 삼성 sw역량테스트 기출' 카테고리의 다른 글

[백준 17144] 미세먼지 안녕!  (0) 2020.01.29
[백준 3190] 뱀  (0) 2020.01.29
[백준 14503] 로봇 청소기  (0) 2020.01.28
[백준 14501] 퇴사  (0) 2020.01.27
[백준 13458] 시험 감독  (0) 2020.01.27

+ Recent posts