더북(TheBook)

마지막으로 점화식에 따라 더 작은 부분 문제를 해결하고, 그 결과로 나온 과정들을 이어 붙여야 합니다. 이는 다음과 같이 작성할 수 있습니다.

private List<int[]> hanoi(int n, int from, int to) {
    if (n == 1) return List.of(new int[] {from, to});
 
    int empty = 6 - from - to;
 
    List<int[]> result = new ArrayList<>();
    result.addAll(hanoi(n–1, from, empty));
    result.addAll(hanoi(1, from, to));
    result.addAll(hanoi(n–1, empty, to));
    return result;
}

잠깐만요

이렇게 매 부분 문제마다 리스트를 새로 만들고 원소를 이어 붙여 주는 것은 하나의 부분 문제를 해결할 때마다 구해 놓은 모든 과정을 전부 순회해야 하므로 비효율적입니다. 이후에 이를 어떻게 최적화할 수 있는지 살펴볼 것입니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.