코테 문제 풀이

[Node.js] 구름톤 챌린지 2주 Day5 풀이 (GameJam)

2DC 2023. 8. 27. 17:27

문제

  • 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이 될 것이다.