[백준] 14499번: 주사위

2022. 10. 10. 01:00TIL💡/Algorithms

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

 

14499번: 주사위 굴리기

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

www.acmicpc.net

지금까지 풀었던 문제와 완전히 다른 유형이다..어려운 구현 그 자체이다.

우선 주사위 굴러가는 걸 어떻게 구현할 것인가가 관건이다.

이 때 잘 생각해보면 주사위를 공중에 띄워놓고 면들만 굴려서 바꿔치기 한다고 생각하면 문제가 간단해진다.

그래서 크게 남북/ 동서로 회전 방향을 2가지로 나뉘어 놓는다.

그리고 면들을 각 방향에 맞춰 회전한다.

 

앞면은 임의로 정하면 된다.

 

여기까지는 잘했는데, 몇몇 테스트 케이스는 통과를 하지 못했다.

알고보니 큰 실수를 했었다.

여기서 큰 행위는 1) 주사위의 위치를 옮기는 것 2) 주사위를 굴리는 것이다.

그런데 반드시 주사위의 위치를 옮긴 후, 유효한 위치인 경우에만 주사위를 굴려야 한다.

왜냐하면 문제에 의하면 범위를 벗어난 이동은 무시하라고 하기 때문이다.

 

#include <iostream>
#include <vector>
using namespace std;
int N, M, K;
int x, y;
vector<int> dice(6, 0);
int dr[4] = {0, 0, -1, 1};
int dc[4] = {1, -1, 0, 0};
void roll_dice(int cmd) {
	int dice0 = dice[0], dice1 = dice[1], dice2 = dice[2];
	int dice3 = dice[3], dice4 = dice[4], dice5 = dice[5];
	// 동쪽
	if(cmd == 1) {
		dice[0] = dice1;
		dice[1] = dice2;
		dice[2] = dice5;
		dice[5] = dice0;
	}
	// 서쪽
	else if(cmd == 2) {
		dice[0] = dice5;
		dice[1] = dice0;
		dice[2] = dice1;
		dice[5] = dice2;
	}
	// 북쪽
	else if(cmd == 3) {
		dice[3] = dice5;
		dice[1] = dice3;
		dice[4] = dice1;
		dice[5] = dice4;
	}
	// 남쪽
	else {
		dice[3] = dice1;
		dice[1] = dice4;
		dice[4] = dice5;
		dice[5] = dice3;
	}
}

pair<int,int> move(int x, int y, int cmd) {
	int nx = x + dr[cmd - 1];
	int ny = y + dc[cmd - 1];

	return make_pair(nx, ny);
}

bool inside(int x, int y) {
	return x >= 0 && x < N && y >= 0 && y < M; 
}
int main() {
	cin >> N >> M >> x >> y >> K;
	vector<vector<int>> map(N, vector<int>(M));
	int cmd;
	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 >> cmd;
		
		auto new_pos = move(x, y, cmd);
		if(!inside(new_pos.first, new_pos.second)) {
			continue;
		}
		x = new_pos.first;
		y = new_pos.second;
		// 옮긴 후에 주사위 굴려야함
		// 만약 옮긴 결과가 범위를 벗어나면 무효처리해야 하기 때문
		roll_dice(cmd);
		if(map[x][y] == 0) {
			map[x][y] = dice[1];
		}
		else {
			dice[1] = map[x][y];
			map[x][y] = 0;
		}
		cout << dice[5] << '\n';
	}
}

첫 문제 풀었는데 하루 다 갔다..

시험까지 남은 일주일이 걱정이다..ㅠ

'TIL💡 > Algorithms' 카테고리의 다른 글

[백준] 14891번: 톱니바퀴  (0) 2022.10.10
[백준] 14503번: 로봇 청소기  (0) 2022.10.10
[백준] 22866번: 탑 보기  (0) 2022.10.09
[백준] 2668번: 숫자고르기 with unique DFS  (0) 2022.10.08
[파이썬] queue  (0) 2022.10.07