
const fs = require('fs');
const path = process.platform === 'linux' ? '/dev/stdin' : 'Wiki\\input.txt';
const [nmxyk, ...inputs] = fs
.readFileSync(path)
.toString()
.trim()
.split('\n');
let [n, m, x, y, k] = nmxyk.split(' ').map(Number);
const comments = inputs[inputs.length - 1];
const map = inputs.splice(0, n).map((it) => it.split(' ').map(Number));
let dice = [0, 0, 0, 0, 0, 0];
const checkRange = (x, y) => {
if (x < 0 || y < 0 || x >= n || y >= m) return false;
return true;
};
const moveRight = () => {
y += 1;
const newDice = [...dice];
dice = [
newDice[3],
newDice[1],
newDice[0],
newDice[5],
newDice[4],
newDice[2],
];
if (map[x][y] === 0) {
map[x][y] = dice[5];
} else {
dice[5] = map[x][y];
map[x][y] = 0;
}
console.log(dice[0]);
};
const moveLeft = () => {
y -= 1;
const newDice = [...dice];
dice = [
newDice[2],
newDice[1],
newDice[5],
newDice[0],
newDice[4],
newDice[3],
];
if (map[x][y] === 0) {
map[x][y] = dice[5];
} else {
dice[5] = map[x][y];
map[x][y] = 0;
}
console.log(dice[0]);
};
const moveUp = () => {
x -= 1;
const newDice = [...dice];
dice = [
newDice[4],
newDice[0],
newDice[2],
newDice[3],
newDice[5],
newDice[1],
];
if (map[x][y] === 0) {
map[x][y] = dice[5];
} else {
dice[5] = map[x][y];
map[x][y] = 0;
}
console.log(dice[0]);
};
const moveDown = () => {
x += 1;
const newDice = [...dice];
dice = [
newDice[1],
newDice[5],
newDice[2],
newDice[3],
newDice[0],
newDice[4],
];
if (map[x][y] === 0) {
map[x][y] = dice[5];
} else {
dice[5] = map[x][y];
map[x][y] = 0;
}
console.log(dice[0]);
};
for (const c of comments.split(' ')) {
if (c === '1' && checkRange(x, y + 1)) moveRight();
if (c === '2' && checkRange(x, y - 1)) moveLeft();
if (c === '3' && checkRange(x - 1, y)) moveUp();
if (c === '4' && checkRange(x + 1, y)) moveDown();
}
⏰ 소요한 시간 : 3시간
시뮬레이션 유형의 문제. 구현하는데 세시간이고 이해하는 시간까지 합하면 더 오래걸렸던 것 같다.
질문게시판에서 대다수 사람들의 제시하는 문제는 x와 y좌표가 이상하다! 라는 것이다.
일반적으로 x가 가로, y가 세로를 뜻하지만 이 문제에서는 x가 세로 y가 가로를 의미한다 라는 것이다.
하지만 나는 이 문제를 그림을 그려서 풀었기에 좌표로 문제가 되지 않았다.
내가 어려움을 겪었던건 그냥 어휘였다. 주사위를 굴린다고 표현했다가, 이동한다고 표현했다가, 놓는다고 표현했다가,, 이것 때문에 문제만 30분 이상 읽었던 것 같다.;
서론이 길었지만 코드를 차근차근 해석해보자면 입력에서 명령 comments를 분리해주고, map과 dice를 만들어준다. 그리고 각 코멘트에 따라 이동가능한지 확인해주면 된다.
만약 코멘트가 1이라면 동쪽으로 이동해야하고 오른쪽으로 이동해야 한다.
이때 x좌표를 이동한다고 생각할 수 있는데 위 그림처럼 숫자 5를 6 자리로 옮기려면 y좌표를 1 증가시켜줘야 한다는것을 캐치할 수 있을 것이다.
그래서 아래와 같이 이동 조건이 세워지는 것이다.
if(c === '1' && checkRange(x, y + 1))
조건을 만족하면 이동을 하면 되는데 여기서도 이동조건에 맞게 이동을 해야된다.
먼저 y좌표로 이동을 했으니 y값을 증가시켜주고,
주사위를 오른쪽으로 굴리려면 이전 값을 기억해야 하니까 기존의 dice를 복사해놓는다.
그 후 머릿속으로 시뮬레이션을 돌려 오른쪽으로 굴린 dice를 새롭게 만들어 준다.
그 다음에 주사위와 지도의 숫자값을 바꿔주는것이다.
만약 지도의 칸이 0 이라면 지도의 칸에 주사위 값이 들어가도록,
지도의 칸이 0이 아니라면, 주사위의 바닥에 지도의 칸 값이 들어가고, 지도의 칸 값은 0이 되도록 말이다.
이동까지 완료 했으니 주사위 윗면의 숫자값을 출력해주면 된다.