728x90
반응형
🚀 문제
정렬된 배열에서 특정 값을 찾는 이진 탐색 알고리즘을 구현하시오.
function binarySearch(arr, target) {
// 여기에 코드 작성
}
console.log(binarySearch([1, 3, 5, 7, 9, 11], 5)); // 2
🔹 코드
function binarySearch(arr, target) {
let left = 0;
let right = arr.length - 1;
while (left <= right) {
let mid = Math.floor((left + right) / 2); // 중간 인덱스
if (arr[mid] === target) {
return mid; // 타겟 값이 발견되면 인덱스 반환
} else if (arr[mid] < target) {
left = mid + 1; // 타겟 값이 중간값보다 크면 오른쪽 절반으로
} else {
right = mid - 1; // 타겟 값이 중간값보다 작으면 왼쪽 절반으로
}
}
return -1; // 타겟 값이 배열에 없으면 -1을 반환
}
console.log(binarySearch([1, 3, 5, 7, 9, 11], 5)); // 2
📌 이진 탐색 문제
🔎 1️⃣ 문제가 묻는 것
이진 탐색 문제에서 요구하는 것은 정렬된 배열에서 특정 값을 효율적으로 찾는 방법입니다. 이진 탐색은 배열을 반씩 나누어가며 탐색을 진행하므로 시간 복잡도를 O(log N)로 줄일 수 있습니다. 문제는 일반적으로 배열이 정렬되어 있을 때 주어지며, 목표는 주어진 값이 배열에 있는지 여부를 확인하는 것입니다.
이진 탐색이란?
이진 탐색(Binary Search)은 정렬된 배열에서 특정 값을 찾을 때 반복적으로 배열을 절반씩 나누며 탐색하는 알고리즘입니다. 배열의 크기가 n일 경우, 이진 탐색의 시간 복잡도는 O(log n)입니다. 이는 배열 크기가 커지더라도 탐색 시간이 상대적으로 짧다는 장점이 있습니다.
이진 탐색의 원리
- 배열의 중간값을 찾습니다.
- 중간값과 찾고자 하는 값(target)을 비교합니다.
- 만약 중간값이 찾고자 하는 값보다 크면, 배열의 왼쪽 절반을 탐색합니다.
- 만약 중간값이 찾고자 하는 값보다 작으면, 배열의 오른쪽 절반을 탐색합니다.
- 찾고자 하는 값을 찾을 때까지 이를 반복하며, 찾지 못한 경우 -1을 반환합니다.
🔎 2️⃣ 구현 방식
이진 탐색은 재귀적 방법이나 반복문 방식으로 구현할 수 있습니다.
✅ (1) 재귀
function binarySearchRecursive(arr, target, left = 0, right = arr.length - 1) {
if (left > right) return -1;
let mid = Math.floor((left + right) / 2);
if (arr[mid] === target) {
return mid; // 타겟 값이 발견된 경우
} else if (arr[mid] < target) {
return binarySearchRecursive(arr, target, mid + 1, right); // 오른쪽 절반 탐색
} else {
return binarySearchRecursive(arr, target, left, mid - 1); // 왼쪽 절반 탐색
}
}
console.log(binarySearchRecursive([1, 3, 5, 7, 9, 11], 5)); // 2
- 시간 복잡도: O(log n)
- 공간 복잡도: O(log n) → 재귀 호출로 인해 스택 프레임이 n개 쌓임
- 단점: 스택 오버플로우 위험, 공간 복잡도가 O(log n)으로 상대적으로 더 많은 메모리를 소비합니다.
✅ (2) 반복문
function binarySearch(arr, target) {
let left = 0;
let right = arr.length - 1;
while (left <= right) {
let mid = Math.floor((left + right) / 2); // 중간 인덱스를 계산
if (arr[mid] === target) {
return mid; // 타겟 값이 발견된 경우
} else if (arr[mid] < target) {
left = mid + 1; // 타겟 값이 중간값보다 크면 오른쪽 절반으로
} else {
right = mid - 1; // 타겟 값이 중간값보다 작으면 왼쪽 절반으로
}
}
return -1; // 타겟 값이 배열에 없으면 -1을 반환
}
console.log(binarySearch([1, 3, 5, 7, 9, 11], 5)); // 2
- 시간 복잡도: O(log n)
- 공간 복잡도: O(1)
- 단점: 코드가 상대적으로 길어질 수 있음
🔑 결론
- 이진 탐색은 효율적인 탐색 알고리즘으로, 정렬된 배열에서 특정 값을 찾을 때 매우 유용
- 반복문을 이용한 방식이 직관적이고 성능 면에서 유리
- 재귀 방식은 코드가 간결해지지만 스택 오버플로우를 유발할 수 있기 때문에 배열의 크기가 매우 큰 경우 반복문 방식이 더 나음
728x90
반응형
'Algorithm > 코테준비' 카테고리의 다른 글
[DFS 문제 LV1] 숫자 삼각형 탐색 문제/코드 (0) | 2025.03.18 |
---|---|
[JS] 동적 계획법 (DP)문제 / 중복계산방지, O(n) (0) | 2025.03.16 |
[JS] 피보나치 수 반환 / 재귀함수, 반복문, 시간복잡도,공간복잡도 비교 (0) | 2025.03.16 |
[JS] 버블 정렬 (Bubble Sort) / 버블 정렬, 최적화 버블 정렬, 내장 sort() (0) | 2025.03.15 |
[JS] 문자열 내 각 문자 개수 세기 / Map 사용, Object 사용, reduce 활용 방법 비교 (0) | 2025.03.15 |