티스토리 뷰

입력

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다.

둘째 줄부터 N개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다.

마지막 줄에는 이동하는 명령이 순서대로 주어진다. 동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4로 주어진다.

출력

이동할 때마다 주사위의 윗 면에 쓰여 있는 수를 출력한다. 만약 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안 된다.

 


[BOJ 14499(G5) 리뷰]

 

숫자하나 잘못써서 30분 삽질한 문제 --; 너무 허무했다.

처음에 주사위를 어떻게 표현할지 고민을 했다. 1차원 배열로 해서 바닥면과 상위면을 INDEX로 관리할까 생각했는데 너무 복잡해보였고 그냥 주어진 그대로 2차원배열로 구현했다.

 

전체적인 과정은 아래와 같다.

동,서,남,북 방향에대해 실제 주사위를 굴리는것처럼 각 주사위 값을 변경해준다.

그 후 바닥값을 복사하고 상위면의 값을 출력하면 된다. 

각 방향에 맞게 주사위를 굴리는걸 구현하는게 조금 헷갈렸다. 그거만 구현하니 나머지는 쉽게할 수 있었다.

 

 


#include <iostream>
#include <queue>
#include <math.h>
#include <set>
#include <string>
#include <algorithm>
#include <vector>
#include <stack>
#include <string.h>
using namespace std;

#define X first
#define Y second

int N, M;
pair <int, int> dicerc;
int dice[4][3] = { 0, };
int board[21][21];
int command;


void dice_swap(int dir)
{
	if (dir == 1)
	{
		int temp = dice[1][2];
		for (int i = 2; i > 0; i--)
		{
			dice[1][i] = dice[1][i - 1];
		}
		dice[1][0] = temp;

		temp = dice[1][0];
		dice[1][0] = dice[3][1];
		dice[3][1] = temp;
	}
	else if (dir == 2)
	{
		int temp = dice[1][0];
		for (int i = 0; i < 2; i++)
		{
			dice[1][i] = dice[1][i + 1];
		}
		dice[1][2] = temp;

		temp = dice[1][2];
		dice[1][2] = dice[3][1];
		dice[3][1] = temp;
	}
	else if (dir == 3)
	{
		int temp = dice[0][1];
		for (int i = 0; i < 3; i++)
		{
			dice[i][1] = dice[i+1][1];
		}
		dice[3][1] = temp;
	}
	else if (dir == 4)
	{
		int temp = dice[3][1];
		for (int i = 3; i > 0; i--)
		{
			dice[i][1] = dice[i - 1][1];
		}
		dice[0][1] = temp;
	}
}

void dice_copy()
{
	if (board[dicerc.X][dicerc.Y] == 0)
	{
		board[dicerc.X][dicerc.Y] = dice[3][1]; //바닥면에 주사위 수 복사
	}
	else
	{
		dice[3][1] = board[dicerc.X][dicerc.Y];
		board[dicerc.X][dicerc.Y] = 0;
	}
}

int main()
{
	cin.tie(0);
	ios::sync_with_stdio(0);

	cin >> N >> M >> dicerc.X >> dicerc.Y >> command;
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < M; j++)
		{
			cin >> board[i][j];
		}
	}

	//주사위 바닥면 (3,1) , 주사위 상단면 (1,1)

	for (int i = 0; i < command; i++)
	{
		int temp;
		cin >> temp;

		if (temp == 1)
		{
			auto cur = dicerc;
			int ny = cur.Y + 1;
			if (ny < 0 || ny >= M) continue;
			dicerc.Y += 1; //주사위 좌표 변경
			dice_swap(1);
			dice_copy();
		}
		else if (temp == 2)
		{
			auto cur = dicerc;
			int ny = cur.Y - 1;
			if (ny < 0 || ny >= M) continue;
			dicerc.Y -= 1; //주사위 좌표 변경
			dice_swap(2);
			dice_copy();
		}
		else if (temp == 3)
		{
			auto cur = dicerc;
			int nx = cur.X - 1;
			if (nx < 0 || nx >= N) continue;
			dicerc.X -= 1; //주사위 좌표 변경
			dice_swap(3);
			dice_copy();

		}
		else if (temp == 4)
		{
			auto cur = dicerc;
			int nx = cur.X + 1;
			if (nx < 0 || nx >= N) continue;
			dicerc.X += 1; //주사위 좌표 변경
			dice_swap(4);
			dice_copy();
		}

		cout << dice[1][1] << '\n';

	}

}

 

'알고리즘 풀이 > 시뮬레이션' 카테고리의 다른 글

BOJ : 16236 아기 상어  (0) 2020.08.22
BOJ : 16234 인구 이동  (0) 2020.08.21
BOJ : 3190 뱀  (0) 2020.08.20
BOJ : 14891 톱니바퀴  (0) 2020.08.19
BOJ : 11559 Puyo Puyo  (0) 2020.08.19
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함