프론트 개발자를 위한 여정

모든 영역을 안내하는 개발자

Algorithm/코테준비

[JS] 배열에서 최솟값과 최댓값 찾기 / 정렬sort, Math.min()&max(), 반복문 방법 비교

ji-frontdev 2025. 3. 15. 15:40
728x90
반응형

📌 문제

주어진 배열에서 최솟값최댓값을 찾아 배열로 반환하는 함수를 구현하시오.

function findMinMax(arr) {
  	// 여기에 코드 작성	
}

console.log(findMinMax([3, 1, 4, 1, 5, 9, 2, 6])); // [1, 9]

 


 

🔹 코드

function findMinMax(arr) {
    arr.sort();
    return [arr[0], arr[arr.length - 1]];
}

console.log(findMinMax([3, 1, 4, 1, 5, 9, 2, 6])); // [1, 9]

🔎 풀이 과정

1️⃣ 문제 접근 방식

  • 배열을 정렬한 후, 첫 번째 값과 마지막 값이 최솟값과 최댓값이므로 이를 반환함.
  • 정렬을 사용하는 방식은 직관적이지만, 비효율적인 방법일 수 있음.
  • 더 나은 방법으로 Math.min(), Math.max(), 혹은 직접 탐색하는 방법을 고려할 수 있음.

 

🚀 다른 해결 방법과 성능 분석

 

방법 코드 시간 복잡도 공간 복잡도 장점 단점
1. 정렬 이용 (sort()) ✅ 현재 코드 O(n log n) O(1) 또는 O(n) 코드가 직관적이고 간결함 정렬이 필요 없는데 불필요하게 수행
2. Math.min() & Math.max() 사용 Math.min(...arr), Math.max(...arr) O(n) O(n) (스프레드 연산자) 코드가 짧고 간단함 큰 배열에서는 스택 오버플로우 발생 가능
3. 반복문으로 직접 찾기 for 루프 O(n) O(1) 최적의 시간, 공간 복잡도 코드가 상대적으로 길어질 수 있음

 

📌 1️⃣ 정렬 이용 (sort()) → O(n log n)

function findMinMax(arr) {
    arr.sort((a, b) => a - b);  // 숫자 정렬 보장
    return [arr[0], arr[arr.length - 1]];
}

console.log(findMinMax([3, 1, 4, 1, 5, 9, 2, 6])); // [1, 9]

성능 분석

  • 시간 복잡도: O(n log n) → 정렬이 필요 없는 경우에도 수행됨
  • 공간 복잡도: O(1) (in-place 정렬) 또는 O(n) (새 배열 생성 시)
  • 장점: 코드가 직관적이고 간결함
  • 단점: 정렬 자체가 불필요하게 실행됨

📌 2️⃣ Math.min() & Math.max() 사용 → O(n)

function findMinMax(arr) {
    return [Math.min(...arr), Math.max(...arr)];
}

console.log(findMinMax([3, 1, 4, 1, 5, 9, 2, 6])); // [1, 9]

성능 분석

  • 시간 복잡도: O(n) → 배열을 한 번만 탐색
  • 공간 복잡도: O(n) → 스프레드 연산자가 배열을 복사하면서 공간을 사용
  • 장점: 코드가 가장 짧고 직관적임
  • 단점: 배열 크기가 매우 클 경우 ...arr(스프레드 연산자)이 메모리를 많이 차지하여 스택 오버플로우 발생 가능

📌 3️⃣ 반복문으로 직접 찾기 → O(n) (최적 방법)

function findMinMax(arr) {
    let min = arr[0];
    let max = arr[0];

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

    return [min, max];
}

console.log(findMinMax([3, 1, 4, 1, 5, 9, 2, 6])); // [1, 9]​

성능 분석

  • 시간 복잡도: O(n) → 배열을 한 번만 순회
  • 공간 복잡도: O(1) → 추가적인 메모리 사용 없음
  • 장점: 성능이 가장 최적화된 방법 (정렬 불필요, 추가 메모리 불필요)
  • 단점: 코드가 상대적으로 길어질 수 있음

🏆 결론: 어떤 방법을 선택해야 할까?

방법추천 상황
정렬(sort()) 배열이 이미 정렬된 상태라면 사용 가능하지만, 일반적으로 비효율적
Math.min() & Math.max() 배열이 작은 경우 추천하지만, 크면 메모리 문제가 발생할 수 있음
반복문(for 루프, 직접 비교) 가장 최적의 방법으로 항상 추천

가장 최적의 방법은 for 루프를 이용해 직접 최솟값과 최댓값을 찾는 방법! (O(n)) 🚀

728x90
반응형