자바스크립트 코딩테스트 강좌, 최솟값 찾기 2

이번 강좌에서는 JavaScript를 사용하여 취업용 알고리즘 문제를 해결하는 방법을 상세히 살펴보겠습니다. 이 글에서는 ‘최솟값 찾기 2’ 문제를 다루며, 문제 해결을 위한 접근 방법과 단계별 과정, 그리고 최적화 방법에 대해 자세히 설명하겠습니다.

문제 설명

다음은 배열에서 특정 조건을 만족하는 최솟값을 찾는 문제입니다. 주어진 배열에 대해 다음 조건을 따릅니다:

  • 양의 정수로 구성된 배열이 주어집니다.
  • 배열에서 홀수 번째 인덱스의 요소만 고려하여 최솟값을 찾아야 합니다.
  • 최솟값을 찾지 못한 경우 `null`을 반환해야 합니다.

문제 예시

            Input: [5, 3, 4, 1, 2, 7, 6]
            Output: 1

            Input: [2, 9, 6, 7, 10]
            Output: 9

            Input: [4, 4, 4, 4]
            Output: null
        

문제 해결 접근 방식

이 문제를 해결하기 위해선 다음의 단계를 따릅니다:

  1. 입력된 배열에서 홀수 인덱스의 요소만 추출합니다.
  2. 추출된 요소들 중 최솟값을 찾습니다.
  3. 최솟값이 존재하면 반환하고, 존재하지 않으면 `null`을 반환합니다.

1단계: 홀수 인덱스 요소 추출

홀수 인덱스의 요소를 추출하기 위해 `filter` 메서드를 사용할 수 있습니다. 이 메서드는 주어진 조건을 만족하는 요소들을 배열로 반환합니다.

2단계: 최솟값 찾기

홀수 인덱스에서 추출된 배열로부터 최솟값을 찾는 방법은 여러 가지가 있습니다. `Math.min` 함수를 사용하면 간단하게 최솟값을 찾을 수 있습니다.

3단계: 결과 반환

최솟값을 찾은 후에는 반환하거나, 조건에 따라 `null`을 반환하는 로직을 추가합니다.

문제 해결을 위한 코드 구현

이제 이러한 과정을 바탕으로 문제를 해결하는 JavaScript 코드를 작성해 보겠습니다. 다음은 위에서 설명한 알고리즘을 구현한 코드입니다:

            function findMinOddIndex(arr) {
                // 홀수 인덱스 요소 추출
                const oddIndexedElements = arr.filter((_, index) => index % 2 === 1);

                // 홀수 인덱스 요소가 없을 경우 null 반환
                if (oddIndexedElements.length === 0) {
                    return null;
                }

                // 최솟값 반환
                return Math.min(...oddIndexedElements);
            }

            // 예시 테스트
            console.log(findMinOddIndex([5, 3, 4, 1, 2, 7, 6])); // 1
            console.log(findMinOddIndex([2, 9, 6, 7, 10])); // 9
            console.log(findMinOddIndex([4, 4, 4, 4])); // null
        

코드 설명

위 코드는 다음과 같이 작동합니다:

  • 함수 `findMinOddIndex`는 입력된 배열을 받아서 홀수 인덱스에 해당하는 요소들을 필터링합니다.
  • 필터링된 결과가 빈 배열인 경우, 즉 홀수 인덱스의 요소가 없을 경우 `null`을 반환합니다.
  • 그렇지 않은 경우, `Math.min`을 사용하여 최솟값을 계산하여 반환합니다.

테스트 및 결과값 확인

작성한 코드를 사용해 다양한 테스트 케이스를 실행해 보겠습니다. 실행 결과를 확인하여 올바른 결과가 반환되는지 확인합니다.

  • 입력: [5, 3, 4, 1, 2, 7, 6] → 출력: 1
  • 입력: [2, 9, 6, 7, 10] → 출력: 9
  • 입력: [4, 4, 4, 4] → 출력: null
  • 입력: [] → 출력: null
  • 입력: [0, -1, 3, -5, 4] → 출력: -5 (홀수 인덱스인 -1과 -5 중 최솟값)

성능 최적화

현재 구현된 코드의 성능은 양호하며, 평균적으로 O(n)의 시간 복잡도를 가집니다. 하지만 배열의 크기가 매우 클 경우 성능을 더욱 최적화할 수 있습니다. 예를 들어, 한 번의 반복만으로 홀수 인덱스의 최솟값을 찾는 방법을 사용할 수 있습니다. 다음은 이를 구현한 예입니다:

            function findMinOddIndexOptimized(arr) {
                let min = Infinity;

                for (let i = 1; i < arr.length; i += 2) {
                    if (arr[i] < min) {
                        min = arr[i];
                    }
                }

                return min === Infinity ? null : min;
            }

            // 예시 테스트
            console.log(findMinOddIndexOptimized([5, 3, 4, 1, 2, 7, 6])); // 1
            console.log(findMinOddIndexOptimized([2, 9, 6, 7, 10])); // 9
            console.log(findMinOddIndexOptimized([4, 4, 4, 4])); // null
        

결론

이번 강좌를 통해 JavaScript를 이용하여 주어진 배열에서 홀수 인덱스의 최솟값을 찾는 방법에 대해 알아보았습니다. 문제의 요구 사항을 명확히 이해하고, 효율적인 알고리즘을 통해 최적의 해결책을 도출하는 과정은 코딩테스트에서 매우 중요한 스킬입니다. 배열의 필터링과 매핑을 통해 문제를 쉽게 해결할 수 있지만, 성능을 고려한 최적화 또한 필요합니다.

앞으로의 코딩테스트를 위한 연습에서 이와 같은 패턴 문제를 반복적으로 풀어보며 익숙해지시길 바랍니다. 추가적으로 여러 변형 문제들을 시도하면서 문제 해결 능력을 향상시키는 것도 좋습니다.