본문 바로가기

Archived(CSE Programming)/알고리즘(C++)

백준 14499_주사위 굴리기

문제 : 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개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다. 마

www.acmicpc.net

해당 문제는 시뮬레이션 문제로 문제 상황을 그대로 프로그래밍으로 옮기는 과정이 중요하다.

주사위를 굴릴 때마다 각 면이 어떻게 움직이는 지를 이해하고, 문제 상황을 정확히 이해하면 풀 수 있다.

단, 문제의 주어진 조건들을 정확히 읽고 놓치지 않아야 한다.

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

// 동서북남, 주사위
int dx[5] = { 0,0,0,-1,1 };
int dy[5] = { 0,1,-1,0,0 };
int dice[7];
int mp[20][20];

int main() {
	// 입력받기
	int n, m, x, y, l;
	cin >> n >> m;
	cin >> x >> y >> l;

	// map 
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			cin >> mp[i][j];

	// main
	while (l--) {
		// 움직일 방향
		int k;
		cin >> k;

		// 이동
		int nx = x + dx[k];
		int ny = y + dy[k];

		// 조건 검사
		if (nx >= n || nx < 0 || ny >= m || ny < 0)
			continue; // 넘어가기

		// 동
		if (k == 1) {
			int temp = dice[1];
			dice[1] = dice[4];
			dice[4] = dice[6];
			dice[6] = dice[3];
			dice[3] = temp;
		}
		// 서
		else if (k == 2) {
			int temp = dice[1];
			dice[1] = dice[3];
			dice[3] = dice[6];
			dice[6] = dice[4];
			dice[4] = temp;
		}
		// 남
		else if (k == 3) {
			int temp = dice[1];
			dice[1] = dice[5];
			dice[5] = dice[6];
			dice[6] = dice[2];
			dice[2] = temp;
		}
		// 북
		else if (k == 4) {
			int temp = dice[1];
			dice[1] = dice[2];
			dice[2] = dice[6];
			dice[6] = dice[5];
			dice[5] = temp;
		}

		// 해당 위치의 값이 0이면
		if (mp[nx][ny] == 0) 
			mp[nx][ny] = dice[6];

		// 0이 아니라면
		else {
			dice[6] = mp[nx][ny];
			mp[nx][ny] = 0;
		}

		// 출력
		x = nx, y = ny;
		cout << dice[1] << "\n";
	}
}

'Archived(CSE Programming) > 알고리즘(C++)' 카테고리의 다른 글

백준 14503_로봇 청소기  (0) 2019.10.16
백준 14891_톱니바퀴  (0) 2019.10.15
프로그래머스_입국심사  (2) 2019.10.09
프로그래머스_섬 연결하기  (0) 2019.10.09
프로그래머스_NQueen  (0) 2019.10.09