Thief of Wealth

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

 

핵심 아이디어

생소한 시뮬레이션 문제로, 주사위를 굴리는 상황을 생각해야한다.

주사위가 움직일때 각 면의 값들을 업데이트 해주는 함수를 만들고

board 값이 0이면 주사위와 board가 맞닿은 면의 값을 board에 복사,

0이 아니라면 주사위와 board가 맞닿은 면의 값이 board의 값으로 바뀌고, 기존 board는 0으로 바뀐다.

주사위가 굴러질때마다 이동할 수 있으면, 주사위의 하늘을 향하는 면의 값을 출력해주면 된다.

 

const readline = require('readline');
const rl = readline.createInterface({
	input: process.stdin,
	output: process.stdout,
});

const dice = {
	앞: 0,
	뒤: 0,
	상: 0,
	하: 0,
	좌: 0,
	우: 0,
};

const isValidPoint = (n, m, x, y) => {
	if (x >= 0 && y >= 0 && x < n && y < m) {
		return true;
	}
	return false;
};

const rotateDice = (direction, x, y, n, m) => {
	// 동쪽 1, 서쪽 2, 북쪽 3, 남쪽 4
	let isMoved = false;
	switch (direction) {
		case 1:
			if (!isValidPoint(n, m, x, y + 1)) break;
			[x, y] = [x, y + 1];
			[dice['좌'], dice['앞'], dice['우'], dice['뒤']] = [
				dice['뒤'],
				dice['좌'],
				dice['앞'],
				dice['우'],
			];
			isMoved = true;
			break;
		case 2:
			if (!isValidPoint(n, m, x, y - 1)) break;
			[x, y] = [x, y - 1];
			[dice['좌'], dice['앞'], dice['우'], dice['뒤']] = [
				dice['앞'],
				dice['우'],
				dice['뒤'],
				dice['좌'],
			];
			isMoved = true;
			break;
		case 3:
			if (!isValidPoint(n, m, x - 1, y)) break;
			[x, y] = [x - 1, y];
			[dice['상'], dice['앞'], dice['하'], dice['뒤']] = [
				dice['앞'],
				dice['하'],
				dice['뒤'],
				dice['상'],
			];
			isMoved = true;
			break;
		case 4:
			if (!isValidPoint(n, m, x + 1, y)) break;
			[x, y] = [x + 1, y];
			[dice['상'], dice['앞'], dice['하'], dice['뒤']] = [
				dice['뒤'],
				dice['상'],
				dice['앞'],
				dice['하'],
			];
			isMoved = true;
			break;
	}
	return [x, y, isMoved];
};

const solution = function (input) {
	let [n, m, x, y, k] = input
		.shift()
		.split(' ')
		.map((e) => parseInt(e));
	let board = [];
	let orders = input
		.pop()
		.split(' ')
		.map((e) => parseInt(e));
	for (const row of input) {
		board.push(row.split(' ').map((e) => parseInt(e)));
	}
	let isMoved = false;
	let ans = '';
	for (const order of orders) {
		[x, y, isMoved] = rotateDice(order, x, y, n, m);
		if (!isMoved) continue;
		if (board[x][y] === 0) {
			board[x][y] = dice['뒤'];
		} else {
			dice['뒤'] = board[x][y];
			board[x][y] = 0;
		}
		// console.log(dice);
		ans += `${dice['앞']}\n`;
	}
	console.log(ans.trim('\n'));
};

const input = [];
rl.on('line', function (line) {
	input.push(line);
}).on('close', function () {
	solution(input);
	process.exit();
});
profile on loading

Loading...