[구현] 백준 14499 주사위 굴리기

2021. 3. 24. 16:27알고리즘 문제분석

 

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

수행 시간 : 1시간 50분

 

 

1시간 동안 삽질 후 나머지 50분만에 구현성공 한 삼성 sw기출 문제다 난이도는 골드5.. 하지만 알골문제를 풀면서 느끼는 건데 삼성 기출 문제는 일반 문제에 비해 난이도가 높다.. 체감상 골드 3~4 구현 푸는 느낌이랄까..

이 문제에서 가장 핵심은 주사위를 저장하는 배열을 선언해주고 사실상 우리가 필요한 건 1번면과 6번면이므로 1번과 6번을 저장해주는 임시배열을 만들어준다는 느낌으로 풀면 쉽게풀린다. 처음에 삽질할때는 주사위의 전개도를 좌표로 구현해야되나? 라는 생각으로 하드코딩했었는데, 결국 아이디어를 생각해내서 구현성공한 문제이다.

 

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

int n, m, x, y, k;
vector <int> K;
vector <vector<int>> map;
int dx[4] = { 0,0,-1,1 };
int dy[4] = { 1,-1,0,0 };
int dice[7];
vector <int> ans;

void sol() {
	for (int i = 0; i < k;i++) {
		x += dx[K[i] - 1]; // -1해준이유 : dx의 인덱스는 0~3, but K의 인덱스는 1~4 값 사이
		y += dy[K[i] - 1];

		if (x >= 0 && x < n && y >= 0 && y < m) {
			int temp[7];
			copy(dice, dice + 7, temp);
			if (K[i] == 1) { // 동쪽
				dice[1] = temp[4];
				dice[3] = temp[1];
				dice[4] = temp[6];
				dice[6] = temp[3];
			}
			else if (K[i] == 2) { //서쪽
				dice[1] = temp[3];
				dice[3] = temp[6];
				dice[4] = temp[1];
				dice[6] = temp[4];
			}
			else if (K[i] == 3) { // 북쪽
				dice[1] = temp[5];
				dice[2] = temp[1];
				dice[5] = temp[6];
				dice[6] = temp[2];
			}
			else if (K[i] == 4) {  //남쪽
				dice[1] = temp[2];
				dice[2] = temp[6];
				dice[5] = temp[1];
				dice[6] = temp[5];
			}
			if (map[x][y] == 0) {
				map[x][y] = dice[6];
			}
			else {
				dice[6] = map[x][y];
				map[x][y] = 0;
			}
			ans.push_back(dice[1]);
		}
		else { //범위 벗어나면 명령 무시하고 제자리
			x -= dx[K[i] - 1];
			y -= dy[K[i] - 1];
		}
	}
}

int main() {
	cin >> n >> m >> x >> y >> k;
	map.resize(n, vector<int>(m, 0));
	K.resize(k);
	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 >> K[i];
	}
	sol();
	int size = ans.size();
	for (int i = 0;i < size;i++) {
		cout << ans[i] << "\n";
	}
}