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
📌 작성한 코드
// 14499
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "Beakjoon/Gold/test.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const [N, M, a, b, K] = input[0].split(" ").map(Number);
const board = [];
for (let i = 1; i <= N; i++) {
board.push(input[i].split(" ").map(Number));
}
const move = input[N + 1].split(" ").map(Number);
let dice = Array(6).fill(0);
let [x, y] = [a, b];
const dx = [0, 0, -1, 1];
const dy = [1, -1, 0, 0];
const getNewDice = (d, num) => {
const newDice = new Array(6).fill(0);
if (num === 1) {
newDice[0] = d[3];
newDice[1] = d[1];
newDice[2] = d[0];
newDice[3] = d[5];
newDice[4] = d[4];
newDice[5] = d[2];
}
if (num === 2) {
newDice[0] = d[2];
newDice[1] = d[1];
newDice[2] = d[5];
newDice[3] = d[0];
newDice[4] = d[4];
newDice[5] = d[3];
}
if (num === 3) {
newDice[0] = d[1];
newDice[1] = d[5];
newDice[2] = d[2];
newDice[3] = d[3];
newDice[4] = d[0];
newDice[5] = d[4];
}
if (num === 4) {
newDice[0] = d[4];
newDice[1] = d[0];
newDice[2] = d[2];
newDice[3] = d[3];
newDice[4] = d[5];
newDice[5] = d[1];
}
return newDice;
};
move.forEach((v) => {
const nx = x + dx[v - 1];
const ny = y + dy[v - 1];
if (nx < 0 || nx >= N || ny < 0 || ny >= M) return;
dice = getNewDice(dice, v);
if (board[nx][ny] === 0) {
board[nx][ny] = dice[5];
} else {
dice[5] = board[nx][ny];
board[nx][ny] = 0;
}
x = nx;
y = ny;
console.log(dice[0]);
});
📌 설명
(1) 주사위를 동서남북으로 굴렸을 때 주사위의 숫자가 어떻게 변경되는지 구하기

const getNewDice = (d, num) => { // d : 원본 주사위, num : 회전 방향
const newDice = new Array(6).fill(0);
if (num === 1) { // 동
newDice[0] = d[3];
newDice[1] = d[1];
newDice[2] = d[0];
newDice[3] = d[5];
newDice[4] = d[4];
newDice[5] = d[2];
}
if (num === 2) { // 서
newDice[0] = d[2];
newDice[1] = d[1];
newDice[2] = d[5];
newDice[3] = d[0];
newDice[4] = d[4];
newDice[5] = d[3];
}
if (num === 3) { // 남
newDice[0] = d[1];
newDice[1] = d[5];
newDice[2] = d[2];
newDice[3] = d[3];
newDice[4] = d[0];
newDice[5] = d[4];
}
if (num === 4) { // 북
newDice[0] = d[4];
newDice[1] = d[0];
newDice[2] = d[2];
newDice[3] = d[3];
newDice[4] = d[5];
newDice[5] = d[1];
}
return newDice; // 새로운 주사위 반환
};
(2) 주사위 굴리기 구현하기
- 주사위를 회전시키면 도착하게 될 곳의 좌표를 구해준다, (dx,dy는 동서남북 순으로 정의해주었다.)
- 이동할 좌표가 범위를 벗어나게 된다면 이동하면 안되므로, 범위가 벗어났을 경우 return해서 다음 이동으로 넘어가준다.
- 주사위를 회전 시킨다.(getNewDice 함수를 이용해서 회전했을 때 주사위에 적힌 숫자를 가져온다)
- 지도의 바닥이 0이라면, 지도의 값을 주사위의 바닥값으로 변경하고, 지도의 바닥이 0이 아니라면 주사위의 바닥 값을 지도의 값으로 변경한 뒤 지도는 0으로 변경한다.
- 이동한 곳의 좌표를 업데이트 해준다.
let dice = Array(6).fill(0);
let [x, y] = [a, b];
const dx = [0, 0, -1, 1];
const dy = [1, -1, 0, 0];
move.forEach((v) => {
const nx = x + dx[v - 1];
const ny = y + dy[v - 1];
if (nx < 0 || nx >= N || ny < 0 || ny >= M) return;
dice = getNewDice(dice, v);
if (board[nx][ny] === 0) {
board[nx][ny] = dice[5];
} else {
dice[5] = board[nx][ny];
board[nx][ny] = 0;
}
x = nx;
y = ny;
console.log(dice[0]);
});
✅ 성공

'알고리즘 > 백준' 카테고리의 다른 글
| [JavaScript/DP] 백준 실버 1 : 1890 - 점프 (3) | 2024.03.04 |
|---|---|
| [JavaScript] 백준 골드 4 : 20056 - 마법사 상어와 파이어볼 (1) | 2024.03.01 |
| [JavaScript/DP] 백준 골드 5 : 2240 - 자두나무 (0) | 2024.02.29 |
| [JavaScript/Greedy] 백준 골드 4 : 1744 - 수 묶기 (0) | 2024.02.29 |
| [JavaScript/이분탐색] 백준 실버 2 : 1654 - 랜선 자르기 (1) | 2024.02.28 |