이번 글에서는 JavaScript를 활용해 배열에서 세 번째로 작은 숫자를 찾는 방법을 알아보겠습니다.
문제 정의
길이가 최소 3 이상인 숫자 배열을 입력으로 받는 JavaScript 함수를 작성해야 합니다.
이 함수는 배열에서 세 번째로 작은 숫자를 반환해야 합니다.
해결 접근 방식
가장 직관적인 방법은 다음과 같습니다.
- 원본 배열을 변경하지 않도록 복사본을 만듭니다.
- 복사본에서 가장 작은 값을 두 차례에 걸쳐 제거합니다.
- 남은 배열의 최솟값이 곧 세 번째로 작은 숫자가 됩니다.
예제 코드
다음은 위 로직을 구현한 코드입니다.
const arr = [6, 7, 3, 8, 2, 9, 4, 5];
const thirdSmallest = () => {
const copy = arr.slice(); // 원본 배열 보존을 위해 복사
// 가장 작은 값 두 개를 제거
for (let i = 0; i < 2; i++) {
const minIndex = copy.indexOf(Math.min(...copy));
copy.splice(minIndex, 1);
}
// 남은 값 중 최소값 = 세 번째로 작은 숫자
return Math.min(...copy);
};
console.log(thirdSmallest(arr)); // 4
실행 결과
4
배열 [6, 7, 3, 8, 2, 9, 4, 5]에서 가장 작은 값은 2, 두 번째로 작은 값은 3입니다. 이 두 값을 제거하면 남은 값들 중 최소값인 4가 세 번째로 작은 숫자가 됩니다.
대안: 정렬을 활용한 간단한 방법
코드의 가독성을 높이고 싶다면 배열을 오름차순으로 정렬한 뒤 인덱스로 접근하는 방법도 사용할 수 있습니다.
const thirdSmallestSorted = arr => [...arr].sort((a, b) => a - b)[2];
console.log(thirdSmallestSorted([6, 7, 3, 8, 2, 9, 4, 5])); // 4
정렬 방식은 코드가 훨씬 간결하다는 장점이 있지만, 전체 배열을 정렬하기 때문에 시간 복잡도는 O(n log n)입니다. 반면 첫 번째 방식은 최솟값 탐색만 반복하므로 상황에 따라 더 효율적일 수 있습니다.
마무리
이처럼 JavaScript에서는 Math.min(), indexOf(), splice() 또는 sort()를 조합하여 k번째로 작은 숫자를 손쉽게 구할 수 있습니다. 배열의 크기와 성능 요구 사항에 맞는 방법을 선택하시기 바랍니다.