더북(TheBook)

단계 수를 기록하는 코드를 함수에 추가해서 함수에 실제로 N2단계가 걸리는지 증명할 수 있다.

function hasDuplicateValue(array) {
    let steps = 0; // 단계 수
    for(let i = 0; i < array.length; i++) {
        for(let j = 0; j < array.length; j++) { 
            steps++; // 단계 수를 증가시킨다. 
             if(i !== j && array[i] === array[j]) {
                return true; 
            }
        } 
    }
    console.log(steps); // 중복 값이 없으면 단계 수를 출력한다.
    return false; 
}

추가한 코드는 중복 값이 없을 때 단계 수를 출력한다. 가령 hasDuplicateValue([1, 4, 5, 2, 9])를 실행하면 자바스크립트 콘솔에 배열의 5개 원소에 대해 25번의 비교가 있었음을 뜻하는 25가 출력될 것이다. 다른 값으로 테스트해도 항상 배열 크기의 제곱이 출력된다. 전형적인 O(N2)이다.

루프 내에 다른 루프를 중첩하는 알고리즘이라면 대부분(항상은 아니다) O(N2)이다. 따라서 중첩 루프가 보이면 O(N2) 알람이 머릿속에 울리기 시작해야 한다.

이제는 함수가 O(N2)이라는 사실을 진지하게 받아들여야 한다. O(N2)은 상대적으로 느린 알고리즘으로 간주되기 때문이다. 느린 알고리즘을 마주할 때는 시간을 들여 더 빠른 대안은 없을지 깊이 생각해 보는 것이 좋다. 더 나은 방법이 없을 수도 있지만, 먼저 확실히 해두자.

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