백준에서 "나이트의 이동" 문제를 풀다가 예상 외의 버그를 마주했다.
BFS 구현 자체는 간단한 문제였지만, 결과가 이상하게 나오고 TypeError
까지 발생하면서 꽤 시간을 썼다.
결론적으로는 자바스크립트의 2차원 배열 초기화 방식과 변수 오타라는 기본적인 실수가 원인이었다.
문제 개요

체스판 위의 나이트가 한 칸에서 다른 칸으로 이동할 때 최소 몇 번의 이동이 필요한지를 구하는 문제다.
체스판 크기는 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 구현의 문제가 아니라,
- 배열 초기화 시 참조 문제, 그리고
- 숫자 변환 누락, 그리고
- 변수 오타가 겹쳐 발생한 단순하지만 치명적인 실수였다.
프로그래밍은 사소한 디테일 하나로도 한참을 헤맬 수 있다는 걸 다시 한번 느낌....
얕은 복사와 깊은 복사도 한 번 겸사겸사 같이 공부해보는 좋은 계기가 된 것 같다.
'CodingTest DeepDive' 카테고리의 다른 글
[BOJ] 백준 15650 N과M (2) js nodejs - 간결과 효율 부족 (0) | 2025.03.18 |
---|