728x90

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

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

문제 그대로를 코드로 구현하면 된다. 다만 주의할 것은 좌표가 (x, y)가 아니라 (y, x)라는 것이다. 따라서 입력받을 때 y, x 순으로 받아야 한다. 나는 그래서 그냥 row, col로 받았다.

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

int n, m;
int dice[6] = { 0 };
vector<vector<int>> map;

void toNorth(int& nowRow, int& nowCol, int& floorIndex, int& ceilingIndex, int& westIndex, int& eastIndex, int& northIndex, int& southIndex) {
	if (nowRow - 1 < 0) return;
	int temp = floorIndex;
	floorIndex = northIndex;
	northIndex = ceilingIndex;
	ceilingIndex = southIndex;
	southIndex = temp;
	nowRow--;
	if (map[nowRow][nowCol] == 0) {
		map[nowRow][nowCol] = dice[floorIndex];
	}
	else {
		dice[floorIndex] = map[nowRow][nowCol];
		map[nowRow][nowCol] = 0;
	}
	cout << dice[ceilingIndex] << '\n';
}
void toSouth(int& nowRow, int& nowCol, int& floorIndex, int& ceilingIndex, int& westIndex, int& eastIndex, int& northIndex, int& southIndex) {
	if (nowRow + 1 >= n) return;
	int temp = floorIndex;
	floorIndex = southIndex;
	southIndex = ceilingIndex;
	ceilingIndex = northIndex;
	northIndex = temp;
	nowRow++;
	if (map[nowRow][nowCol] == 0) {
		map[nowRow][nowCol] = dice[floorIndex];
	}
	else {
		dice[floorIndex] = map[nowRow][nowCol];
		map[nowRow][nowCol] = 0;
	}
	cout << dice[ceilingIndex] << '\n';
}
void toEast(int& nowRow, int& nowCol, int& floorIndex, int& ceilingIndex, int& westIndex, int& eastIndex, int& northIndex, int& southIndex) {
	if (nowCol + 1 >= m) return;
	int temp = westIndex;
	westIndex = floorIndex;
	floorIndex = eastIndex;
	eastIndex = ceilingIndex;
	ceilingIndex = temp;
	nowCol++;
	if (map[nowRow][nowCol] == 0) {
		map[nowRow][nowCol] = dice[floorIndex];
	}
	else {
		dice[floorIndex] = map[nowRow][nowCol];
		map[nowRow][nowCol] = 0;
	}
	cout << dice[ceilingIndex] << '\n';
}
void toWest(int& nowRow, int& nowCol, int& floorIndex, int& ceilingIndex, int& westIndex, int& eastIndex, int& northIndex, int& southIndex) {
	if (nowCol - 1 < 0) return;
	int temp = floorIndex;
	floorIndex = westIndex;
	westIndex = ceilingIndex;
	ceilingIndex = eastIndex;
	eastIndex = temp;
	nowCol--;
	if (map[nowRow][nowCol] == 0) {
		map[nowRow][nowCol] = dice[floorIndex];
	}
	else {
		dice[floorIndex] = map[nowRow][nowCol];
		map[nowRow][nowCol] = 0;
	}
	cout << dice[ceilingIndex] << '\n';
}


int main() {
	int nowCol, nowRow, k;
	cin >> n >> m >> nowRow >> nowCol >> k;
	map = vector<vector<int>>(n, vector<int>(m));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> map[i][j];
		}
	}
	int floorIndex = 0;
	int eastIndex = 1;
	int ceilingIndex = 2;
	int westIndex = 3;
	int northIndex = 4;
	int southIndex = 5;
	for (int i = 0; i < k; i++) {
		int direction;
		cin >> direction;
		switch (direction) {
		case 1:
			toEast(nowRow, nowCol, floorIndex, ceilingIndex, westIndex, eastIndex, northIndex, southIndex);
			break;
		case 2:
			toWest(nowRow, nowCol, floorIndex, ceilingIndex, westIndex, eastIndex, northIndex, southIndex);
			break;
		case 3:
			toNorth(nowRow, nowCol, floorIndex, ceilingIndex, westIndex, eastIndex, northIndex, southIndex);
			break;
		case 4:
			toSouth(nowRow, nowCol, floorIndex, ceilingIndex, westIndex, eastIndex, northIndex, southIndex);
			break;
		}
	}
	return 0;
}
728x90

+ Recent posts