Min:D's Devlog

[백준][삼성 SW 역량 테스트][Gold 5][C++] 14499 주사위 굴리기 본문

알고리즘/백준

[백준][삼성 SW 역량 테스트][Gold 5][C++] 14499 주사위 굴리기

Min:D 2020. 10. 10. 19:00

문제

백준 삼성 SW 역량 테스트 기출 문제 - 14499 주사위 굴리기 (Gold 5)

 

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

 


문제 풀이

접근 방식

이 문제는 주사위를 규칙에 맞게 굴려 윗면의 수를 출력하는 시뮬레이션 문제였다.

 

우선, 아래의 전개도에 적혀 있는 숫자가 벡터의 인덱스를 의미하고,

인덱스 5주사위의 아래쪽dice 벡터를 만들어주었고, 모든 값을 0으로 초기화해주었다.

 

주사위의 전개도

 

그리고 move 함수를 만들어 주사위를 이동시켜주고, 윗면의 숫자answer 벡터에 저장해주었다.

주사위는 항상 인덱스 5가 아래쪽을 의미하도록 고정해주었고,

이동할 때마다 다음과 같이 저장된 값을 이동시켜주며 주사위의 이동을 구현하였다.

 

주사위의 이동에 따른 값의 이동

 

이동을 완료한 후, 해당 위치의 map에 저장되어 있는 숫자가 0이면 map에 dice[5]의 값을 복사해주었고,

그렇지 않다면 dice[5]의 값map에 저장된 숫자로 바꿔주고, map의 숫자를 0으로 바꿔주었다.

그 후, 주사위의 위쪽의 숫자인 dice[2]의 값을 answer에 저장해주었다.

(map을 벗어나는 이동이면 아예 이동을 수행하지 않도록 구현하였다.)

 

모든 이동을 끝낸 후, answer에 저장된 값을 출력하여 문제를 해결하였다.

 


풀이 코드 - C++

#include <iostream>
#include <vector>
using namespace std;

vector<int> dice = { 0,0,0,0,0,0 };
int N, M, x, y, K;
vector<vector<int>> map;
int dirs[4][2] = { {0,1},{0,-1},{-1,0},{1,0} };
vector<int> answer;

void move(int dir) {
	int nx = x + dirs[dir - 1][0];
	int ny = y + dirs[dir - 1][1];
	if (nx < 0 || nx >= N || ny < 0 || ny >= M) return;
	x = nx; y = ny;
	vector<int> temp = dice;
	switch (dir) {
	case 1:
		temp[1] = dice[5];
		temp[2] = dice[1];
		temp[3] = dice[2];
		temp[5] = dice[3];
		dice = temp;
		break;
	case 2:
		temp[1] = dice[2];
		temp[2] = dice[3];
		temp[3] = dice[5];
		temp[5] = dice[1];
		dice = temp;
		break;
	case 3:
		temp[0] = dice[2];
		temp[2] = dice[4];
		temp[4] = dice[5];
		temp[5] = dice[0];
		dice = temp;
		break;
	case 4:
		temp[0] = dice[5];
		temp[2] = dice[0];
		temp[4] = dice[2];
		temp[5] = dice[4];
		dice = temp;
		break;
	}
	if (map[x][y] == 0) {
		map[x][y] = dice[5];
	}
	else {
		dice[5] = map[x][y];
		map[x][y] = 0;
	}

	answer.push_back(dice[2]);
}

int main() {
	cin >> N >> M >> x >> y >> K;
	map.assign(N, vector<int>(M));
	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++) {
		int dir;
		cin >> dir;
		move(dir);
	}
	for (int i : answer)
		cout << i << "\n";
}

실행 결과

실행 결과 : 통과 (0ms)

Comments