JavaScript DFS에서 [...path, i]와 push/pop 비교 - 상태 복사 vs 복원
2025. 5. 8. 18:07
728x90

1. 문법 개념 요약

JavaScript에서 ... 전개 연산자는 배열의 요소를 펼쳐서 새로운 배열을 만드는 데 사용된다.

const path = [1, 2];
const newPath = [...path, 3]; // 결과: [1, 2, 3]
  • 기존 배열 path를 복사하면서 3이라는 새 요소를 뒤에 추가한 형태
  • 기존 배열을 변경하지 않고, 새로운 배열을 만들어냄 (불변성 유지)

2. DFS/재귀 구조에서의 활용

DFS(또는 백트래킹)에서 현재 상태(path)를 복사해서 다음 단계로 넘길 때 유용하다.

function dfs(depth, path) {
    if (depth === M) {
        console.log(path);
        return;
    }

    for (let i = 1; i <= N; i++) {
        if (!visited[i]) {
            visited[i] = true;
            dfs(depth + 1, [...path, i]);  // 상태를 복사하여 넘김
            visited[i] = false;
        }
    }
}
  • 각 DFS 분기마다 새로운 path 상태를 만들기 때문에, 이전 상태를 건드리지 않음
  • push/pop 없이 상태 복제와 전달을 동시에 처리 가능

3. push/pop 방식과 비교

// 기존 상태를 직접 수정하고 복원
path.push(i);
dfs(depth + 1, path);
path.pop(); // 복원 필요

방식 장점 단점

[...path, i] 불변 상태 유지, 안전함 메모리 사용 많고 느릴 수 있음
push / pop 성능 효율적, 메모리 절약 상태 복원 수동 관리 필요
  • 성능과 메모리가 중요한 문제에서는 push/pop이 더 유리할 수 있음
  • 그러나 코드 가독성, 안전성 측면에서는 ...path 방식이 더 직관적

4. 마무리 회고

  • 알고리즘 문제 풀이에서 ... 전개 연산자는 상태 관리를 깔끔하게 해주는 좋은 도구다.
  • 특히 DFS처럼 재귀 호출이 많은 구조에서는 불변 상태 유지가 디버깅과 테스트에 큰 도움이 된다.
  • 단, 입력이 커지고 시간제한이 빡빡할 때는 push/pop 방식으로 성능 최적화를 고려하는 것이 좋다.

 요약

  • [...path, i]: 새 배열을 만들어 재귀에 넘김 → 안전하고 직관적
  • push/pop: 기존 배열 재사용 → 성능 유리하지만 수동 복원 필요
728x90