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


[ 알고리즘풀이 ]

특정 알고리즘 기법을 사용해야되는 문제가 아니라, 단순 구현 문제입니다. 주사위를 서쪽, 동쪽, 북쪽, 남쪽으로 굴렸을 때 주사위의 상태 변화를 잘 구현하면 문제를 쉽게 해결할 수 있습니다.

위의 그림과 같이 주사위의 왼쪽, 오른쪽, 뒤쪽, 위쪽, 앞쪽, 아래쪽에 번호를 하나씩 부여하겠습니다. 이 번호대로 dice 배열에 현재 주사위의 상태를 저장할 것입니다.

 

주사위를 남쪽으로 굴리면 다음과 같은 변화가 생깁니다.

뒤쪽, 위쪽, 앞쪽, 아래쪽에 있던 값들이 한 칸씩 밀려나가는 것을 확인할 수 있습니다.

북쪽으로 굴리면 반대로 다음과 같은 변화가 생깁니다.

동쪽으로 굴리면 다음과 같은 변화가 생깁니다.

서쪽으로 굴리면 다음과 같은 변화가 생깁니다.

이 과정을 각각 외부함수로 구현하고 문제에 나와있는 조건들만 반영해준다며 쉽게 해결할 수 있습니다.

#include<iostream>

using namespace std;

// 주사위는 뒷위앞아래 왼오 순으로.
int N, M, x, y, K, t, map[20][20] = {}, dice[6] = {};

void moveRight() {
	int curX = x, curY = y + 1;
	if (!(0 <= curY && curY < M))
		return;
	y = y + 1;
	int temp = dice[4];
	dice[4] = dice[3];
	dice[3] = dice[5];
	dice[5] = dice[1];
	dice[1] = temp;
	if (map[curX][curY] != 0) {
		dice[3] = map[curX][curY];
		map[curX][curY] = 0;
	}
	else
		map[curX][curY] = dice[3];
	cout << dice[1] << '\n';

}
void moveLeft() {
	int curX = x, curY = y - 1;
	if (!(0 <= curY && curY < M))
		return;
	y = y - 1;
	int temp = dice[4];
	dice[4] = dice[1];
	dice[1] = dice[5];
	dice[5] = dice[3];
	dice[3] = temp;

	if (map[curX][curY] != 0) {
		dice[3] = map[curX][curY];
		map[curX][curY] = 0;
	}
	else
		map[curX][curY] = dice[3];
	cout << dice[1] << '\n';
}

void moveUp() {
	int curX = x - 1, curY = y;
	if (!(0 <= curX && curX < N))
		return;
	//위로 이동.
	x = x - 1;
	int temp = dice[0];
	dice[0] = dice[1];
	dice[1] = dice[2];
	dice[2] = dice[3];
	dice[3] = temp;

	if (map[curX][curY] != 0) {
		dice[3] = map[curX][curY];
		map[curX][curY] = 0;
	}
	else
		map[curX][curY] = dice[3];
	cout << dice[1] << '\n';
}

void moveDown() {
	int curX = x + 1, curY = y;
	if (!(0 <= curX && curX < N))
		return;
	//아래로 이동.
	x = x + 1;
	int temp = dice[3];
	dice[3] = dice[2];
	dice[2] = dice[1];
	dice[1] = dice[0];
	dice[0] = temp;

	if (map[curX][curY] != 0) {
		dice[3] = map[curX][curY];
		map[curX][curY] = 0;
	}
	else
		map[curX][curY] = dice[3];
	cout << dice[1] << '\n';
}

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	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 >> t;
		if (t == 1) moveRight();
		else if (t == 2) moveLeft();
		else if (t == 3) moveUp();
		else moveDown();
	}
	return 0;
}

 

+ Recent posts