코테 문제 풀이

[Node.js] 구름톤 챌린지 2주 Day4 풀이 (폭탄 구현하기(2))

2DC 2023. 8. 27. 17:14

문제

  • N x N 크기의 행렬이 주어진다. 행렬은 땅의 상태로 채워진다.
  • 행렬의 각 좌표에는 폭탄이 떨어지는데, 폭탄은 땅의 상태에 비례하여 점수가 계산된다.
  • 폭탄 좌표에 해당하는 땅의 상태가 @일 경우 해당 행렬 위치의 폭탄값은 2씩 증가한다.
  • 폭탄 좌표에 해당하는 땅의 상태가 0일 경우 해당 행렬 위치의 폭탄값은 1씩 증가한다.
  • 폭탄 좌표에 해당하는 땅의 상태가 #일 경우 해당 행렬 위치의 폭탄값 계산은 무시된다.
  • 최초 폭탄값은 모두 0이고, N x N 행렬로 제작된다.

 

코드

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, K] = input.shift().split(" ").map(n => +n)
	const matrix = input.slice(0, N).map(e => e.split(" ").map(n => n))
	const bombCoord = input.slice(N).map(e => e.split(" ").map(n => +n))
	const sheet = Array.from(Array(N), () => Array(N).fill(0))
	const DIR_ARR = [
		[-1, 0],
		[0, -1],
		[0, 0],
		[0, 1],
		[1, 0]
	]
	
	bombCoord.forEach((coord) => {
		const [y, x] = coord
		DIR_ARR.forEach((DIR) => {
			const dy = y + DIR[0] - 1
			const dx = x + DIR[1] - 1
			if (dy < N && dy >= 0 && dx < N && dx >= 0 && matrix[dy][dx] !== "#") {
				if (matrix[dy][dx] === '@') sheet[dy][dx] += 2
				if (matrix[dy][dx] === '0') sheet[dy][dx] += 1
			} 
		})
	})
	
	console.log(Math.max(...sheet.flat()))
})
  • 처음에는 땅의 상태와 폭탄값을 하나의 행렬에 모두 넣었었는데, 코드의 가독성이 정말 끔찍했다.
  • 땅의 상태와 폭탄 값을 별도의 행렬로 만들어 값을 계산하는 것이 가장 좋은 방법인 듯 하다.

 

행렬 문제(DX/DY 기법)

DX/DY 기법을 알고나서 행렬 문제를 푸는 것이 많이 쉬워졌다.

폭탄이 특정 위치에 떨어졌을때 폭탄이 영향이 미치는 곳은 그 좌표의 위치와 상하좌우 이므로, 해당 좌표 위치의 인덱스를 기준으로 인덱스를 만들어 문제를 해결하자.