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
반응형
'Algorithm > 코테준비' 카테고리의 다른 글
[JS] 피보나치 수 반환 / 재귀함수, 반복문, 시간복잡도,공간복잡도 비교 (0) | 2025.03.16 |
---|---|
[JS] 버블 정렬 (Bubble Sort) / 버블 정렬, 최적화 버블 정렬, 내장 sort() (0) | 2025.03.15 |
[JS] 문자열 내 각 문자 개수 세기 / Map 사용, Object 사용, reduce 활용 방법 비교 (0) | 2025.03.15 |
[JS] FizzBuzz 문제 / 조건문, 문자열누적, Map활용 (0) | 2025.03.15 |
[JS] 문자열 뒤집기 / array-reverse, for문, 재귀함수 (0) | 2025.03.15 |