문제
- N x N 행렬에서 특수한 게임이 진행된다.
- 각 칸에는 <command>에 해당하는 방향으로 <count> 칸 만큼 한칸씩 이동하라는 지시가 적혀있다.
- 플레이하는 사람은 처음에 보드의 칸 중 하나에 말을 하나 올려놓는다.
- 각 칸에 적힌 지시대로 말을 이동한다. 만약 이동 중 말이 보드 밖으로 나간다면, 보드의 반대쪽의 첫번째 칸으로 이동한다. 이동거리가 남아있다면 계속 이동한다.
- 만약 이동하다가, 자신의 말이 한번이라도 방문한 칸을 다시 지나야 할 경우에는 게임이 종료된다.
- 그 외의 경우에는 게임이 종료될 때까지 위의 단계를 반복한다.
- 게임의 점수는 시작한 칸을 포함하여, 게임이 종료되기 전까지 말이 방문한 서로 다른 칸의 개수이다.
- 플레이어는 goorm과 player 두명이고, 각 게임은 별개로 이루어진다.
- goorm과 player 중 가장 점수가 높은 플레이어의 이름과 점수를 출력하는 기능을 구현하라.
- count는 1 이상 N 이하의 정수이다.
- command는 U, D, R, L 중 하나이다. 각각 up, down, right, left이다.
코드
const readline = require("readline");
let rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let input = [];
rl.on("line", (line) => {
input.push(line.trim())
}).on("close", () => {
const N = parseInt(input[0])
const [gy, gx] = input[1].split(" ").map(n => parseInt(n) - 1)
const [py, px] = input[2].split(" ").map(n => parseInt(n) - 1)
const gameBoard = input.slice(3).map(n => n.split(" "))
const DIR_KEYS = {
U: [-1, 0],
D: [1, 0],
R: [0, 1],
L: [0, -1]
}
const gameJam = (initY, initX) => {
let y = initY
let x = initX
let count = 0
// N x N 점수 격자
const userBoard = Array.from(Array(N), () => Array(N).fill(false))
while (userBoard[y][x] === false) {
let coord = gameBoard[y][x]
let steps = coord.slice(0, -1)
let dir = coord.slice(-1)
for (let i = 0; i < steps; i++) {
userBoard[y][x] = true
count++
let [dy, dx] = DIR_KEYS[dir]
y = (y + dy + N) % N
x = (x + dx + N) % N
if (userBoard[y][x] !== false) return count
}
}
return count
}
const GOORM_POINT = gameJam(gy, gx)
const PLAYER_POINT = gameJam(py, px)
let answer = ""
PLAYER_POINT > GOORM_POINT ? answer = `player ${PLAYER_POINT}` : answer = `goorm ${GOORM_POINT}`
console.log(answer)
});
방향관리객체
방향이동이 키(U, D, R, L)로 주어지므로, DX/DY를 키-값 처럼 운용할 수 있다.
구름 덕분에 좋은 접근방법을 많이 배운다.
인덱스가 0보다 작거나 N보다 클 경우 새로 할당할 인덱스
y = (y + dy + N) % N
x = (x + dx + N) % N
- 좌표와 dxdy를 더한 인덱스가 -1일 경우, N을 더하면 N - 1이 될 것이다.
- 인덱스의 합이 N을 초과했을 경우에도 N으로 모듈로 되므로 좌표는 0이 될 것이다.
'코테 문제 풀이' 카테고리의 다른 글
[Node.js] 구름톤 챌린지 3주 Day2 풀이 (발전기) (0) | 2023.08.31 |
---|---|
[Node.js] 구름톤 챌린지 3주 Day1 풀이 (통증 (2)) (0) | 2023.08.31 |
[Node.js] 구름톤 챌린지 2주 Day4 풀이 (폭탄 구현하기(2)) (0) | 2023.08.27 |
[Node.js] 구름톤 챌린지 2주 Day3 풀이 (통증) (0) | 2023.08.27 |
[Node.js] 구름톤 챌린지 2주 Day2 풀이 (구름 찾기 깃발) (0) | 2023.08.27 |