본문 바로가기

백준 문제 풀이

백준 14499번 주사위 굴리기 (C++)

728x90

 맞왜틀 때문에 정말 고생한 문제..

사람들이 x,y 어쩌구 하는데 난 그게 문제가 아니었고 (그게 무슨 소리인지도 모르겠더라)

문제를 해석하는게 가장 중요했다. 

1. 주사위가 기본적으로 어떻게 세팅되어있는지 확인해야한다.

2. 타일과 닿아있는 부분이 바뀌는데 출력은 주사위 윗부분임을 주의해야한다.

3. 주사위를 보드 바깥으로 보내면 반드시 아무 작업도 이루어지지 않아야한다.

 

난 3번을 그냥 출력만 안나오게 짰다가 맞왜틀의 늪에 빠져서 몇시간을 낭비했다 ㅠㅠ

가장 중요한 로직은 주사위를 동서남북으로 돌릴때 어떻게 돌려줘야할지가 문제이다. 다른 사람들은 모르겠지만 나는 전개도를 4x4 로 구성해 전개도를 계속 갱신해주었다. 

이런식으로 주사위의 전개도를 갱신한다. 위는 예로 북쪽으로 이동했을 시이고 동서남북 네개 swap해두면된다. 여기까지 생각해내면 문제는 쉽다.

그러나 이 문제는 백준에서 기본 예제를 전부 엄청 일반화된 것을 줘서 예외를 사용자가 찾아내기가 힘들어서 맞왜틀이 진짜 개많았다. 질문하기 탭에도 수많은 사람들이 맞왜틀을 외치고 있었다.

 

#include <iostream>
#include <vector>
#define MAX 100
using namespace std;

vector<int> commedline;
int dicemap[4][4] = { 0, };
int boad[MAX][MAX] = { 0, };

int n, m, r, c, commend;

void convert(int d) {
	if (d == 1) {	// east
		int tmp = dicemap[1][2];
		dicemap[1][2] = dicemap[3][1];
		dicemap[3][1] = dicemap[1][0];
		dicemap[1][0] = dicemap[1][1];
		dicemap[1][1] = tmp;
	}
	else if (d == 2) { // west
		int tmp = dicemap[1][2];
		dicemap[1][2] = dicemap[1][1];
		dicemap[1][1] = dicemap[1][0];
		dicemap[1][0] = dicemap[3][1];
		dicemap[3][1] = tmp;
	}
	else if (d == 3) { //north
		int tmp = dicemap[0][1];
		dicemap[0][1] = dicemap[3][1];
		dicemap[3][1] = dicemap[2][1];
		dicemap[2][1] = dicemap[1][1];
		dicemap[1][1] = tmp;
	}
	else if (d == 4) { // south
		int tmp = dicemap[0][1];
		dicemap[0][1] = dicemap[1][1];
		dicemap[1][1] = dicemap[2][1];
		dicemap[2][1] = dicemap[3][1];
		dicemap[3][1] = tmp;
	}
}

void dfs(int x, int y, int i, bool check) {
	if (i == commedline.size())
		return;
	if (check == true) {
		if (boad[x][y] == 0)
			boad[x][y] = dicemap[1][1];

		else {
			dicemap[1][1] = boad[x][y];
			boad[x][y] = 0;
		}
	}
	int nx = x;
	int ny = y;
	
	if (commedline[i] == 1) {
		ny++;
	}
	else if (commedline[i] == 2) { // west
		ny--;
	}
	else if (commedline[i] == 3) { // north
		nx--;
	}
	else { // south
		nx++;
	}

	if (nx < n && nx > -1 && ny < m && ny > -1) {
		convert(commedline[i]);
		cout << dicemap[3][1] << endl;
		dfs(nx, ny, i + 1, true);
	}
	else {
		dfs(x, y, i + 1, false);
	}
}

int main() {
	cin >> n >> m >> r >> c >> commend;

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> boad[i][j];
		}
	}
	
	for (int i = 0; i < commend; i++) {
		int tmp;
		cin >> tmp;
		commedline.push_back(tmp);
	}
	dfs(r, c, 0, true);
}

힘들었다....