[BOJ] 백준 7562 node.js 나이트의 이동 - 2차원 배열 초기화

백준에서 "나이트의 이동" 문제를 풀다가 예상 외의 버그를 마주했다.
BFS 구현 자체는 간단한 문제였지만, 결과가 이상하게 나오고 TypeError까지 발생하면서 꽤 시간을 썼다.

결론적으로는 자바스크립트의 2차원 배열 초기화 방식과 변수 오타라는 기본적인 실수가 원인이었다.


문제 개요

etc-image-0

체스판 위의 나이트가 한 칸에서 다른 칸으로 이동할 때 최소 몇 번의 이동이 필요한지를 구하는 문제다.
체스판 크기는 l x l이고, 나이트는 8가지 방향으로 움직일 수 있다. BFS로 최단 거리를 구하면 된다.


BFS는 잘 돌아가는데 이상한 에러가...

초기 구현은 아래와 비슷했다.

visited = Array.from({ length: len }, () => new Array(len).fill(false));

visited[x][y]를 true로 설정하면서 방문 여부를 기록하고, 목표 위치에 도달하면 종료하는 BFS 구조다.

그런데 아래 입력에서 문제가 생겼다.

2
10
1 1
1 1
4
0 0
3 3

출력은 이랬다.

0
TypeError: Cannot set properties of undefined (setting '1')

visited 구조가 이상하게 나왔다

console.log(visited)로 찍어보니 이랬다.

[ [ false ], [ false ], [ false ], [ false ] ]

각 행에 false가 하나만 들어 있는 형태. 분명 len x len 배열을 만든다고 생각했는데, 어딘가 이상했다.


원인은 배열 초기화보다 변수 오타였다

문제는 아주 사소한 변수 오타였다. 아래처럼 작성되어 있었다.

lne = Number(len); // ❌ 변수명이 'len'이 아니라 'lne'였음

이후 코드에서는 계속 len을 그대로 쓰고 있어서, len은 여전히 문자열 상태였다.
결국 Array.from({ length: len })에서 문자열 "4" 같은 값이 넘어가면서 배열이 제대로 생성되지 않았다.


고치고 나니 정상 동작..

오타만 고쳐주면 문제 없이 작동한다.

len = Number(len); // 문자열을 숫자로 변환

이제 visited는 정상적으로 len x len 크기의 배열이 되고, BFS도 문제없이 동작한다.


자바스크립트 2차원 배열 초기화 정리

이참에 2차원 배열 초기화에 대해 정리해봤다.

new Array(len).fill(false)
-> 1차원 배열만 가능, 안전

new Array(len).fill(new Array(len).fill(false))
-> 같은 배열을 참조함 (모든 행이 같이 바뀜), 위험

Array.from({ length: len }, () => new Array(len).fill(false))
-> 각 행이 독립된 배열, 적절

잘못된 예시

let visited = new Array(3).fill(new Array(3).fill(false));

visited[0][0] = true;
console.log(visited);
// 모든 행의 [0][0]이 동시에 true로 바뀜

올바른 예시

let visited = Array.from({ length: 3 }, () => new Array(3).fill(false));

visited[0][0] = true;
console.log(visited);
// 오직 visited[0][0]만 true, 나머지는 false

마무리

결국 이 문제는 BFS 구현의 문제가 아니라,

  • 배열 초기화 시 참조 문제, 그리고
  • 숫자 변환 누락, 그리고
  • 변수 오타가 겹쳐 발생한 단순하지만 치명적인 실수였다.

프로그래밍은 사소한 디테일 하나로도 한참을 헤맬 수 있다는 걸 다시 한번 느낌....
얕은 복사와 깊은 복사도 한 번 겸사겸사 같이 공부해보는 좋은 계기가 된 것 같다.