핵심 아이디어
생소한 시뮬레이션 문제로, 주사위를 굴리는 상황을 생각해야한다.
주사위가 움직일때 각 면의 값들을 업데이트 해주는 함수를 만들고
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();
});
'개발 > 알고리즘' 카테고리의 다른 글
[Javascript][BOJ] 1446 지름길 (0) | 2021.01.10 |
---|---|
[Javascript][BOJ] 1504 특정한 최단 경로 (0) | 2021.01.08 |
[Frontend Interview] 프로그레시브 렌더링이 무엇인가? (0) | 2021.01.07 |
[Javascript][BOJ] 1009 분산처리 (0) | 2021.01.07 |
[Javascript][BOJ] 2252 줄세우기 (0) | 2021.01.06 |