본문 바로가기

삼성 SW 역량 테스트 기출문제

[C++] 삼성 SW 역량 테스트 기출문제 백준 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개의 줄에 지

www.acmicpc.net

 

 

 

#include <bits/stdc++.h>

//[C++] 백준 삼성 SW 역량 테스트 기출문제
int n, m, y, x, k;
int map[20][20];
int cmd[1000];
enum {
	U,
	E,
	W,
	N,
	S,
	D
};
// 위 동 서 북 남 아래
int dice[6];
int main()
{
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
	std::cin >> n >> m >> y >> x >> k;
	for (int i = 0; i < n; ++i){
		for (int j = 0; j < m; ++j){
			std::cin >> map[i][j];
		}
	}
	for (int i = 0; i < k; ++i){
		std::cin >> cmd[i];
	}
	for (int i = 0; i < k; ++i){
		/*
		동쪽으로 갈 때
		위-->동
		서-->위
		아래-->서
		동-->아래
		*/
		if (cmd[i] == 1){
			if (x + 1 >= m) continue;
			++x;
			int temp = dice[U];
			dice[U] = dice[W];
			dice[W] = dice[D];
			dice[D] = dice[E];
			dice[E] = temp;
		}
		/*
		서쪽으로 갈 때
		위-->서
		서-->아래
		아래-->위
		아래-->동
		*/
		else if (cmd[i] == 2) {
			if (x - 1 < 0) continue;
			--x;
			int temp = dice[U];
			dice[U] = dice[E];
			dice[E] = dice[D];
			dice[D] = dice[W];
			dice[W] = temp;
		}
		/*
		북쪽으로 갈 때
		위-->북
		북-->아래
		아래-->남
		남-->위
		*/
		else if (cmd[i] == 3) {
			if (y - 1 < 0) continue;
			--y;
			int temp = dice[U];
			dice[U] = dice[S];
			dice[S] = dice[D];
			dice[D] = dice[N];
			dice[N] = temp;
		}
		/*
		남쪽으로 갈 때
		위-->남
		남-->아래
		북-->위
		아래-->북	
		*/
		else {
			if (y + 1 >= n) continue;
			++y;
			int temp = dice[U];
			dice[U] = dice[N];
			dice[N] = dice[D];
			dice[D] = dice[S];
			dice[S] = temp;
		}
		std::cout << dice[U] << '\n';
		// 아래 처리
		if (map[y][x] == 0){
			map[y][x] = dice[D];
		}
		else {
			dice[D] = map[y][x];
			map[y][x] = 0;
		}
	}
	return 0;
}