728x90
반응형
이진탐색 알고리즘은 특정 값이나 인덱스를 탐색해야 할 때 걸리는 시간이나 메모리를 줄이기 위해 사용하는 알고리즘 방법이다.
Q. 오름차순 정렬된 정수의 배열 (arr)과 정수(target)를 입력받아 target의 인덱스를 리턴해야 합니다.
해당 문제는 반복문과 제귀함수를 통해 구현할 수 있다.
먼저 반복문을 통해서 구현해본 코드이다.
//반복문으로 구현했을 때
const binarySearch = function (arr, target) {
let start = 0
let end = arr.length -1
let mid
while (end - start >= 0) {
mid = parseInt((start + end) / 2)
if(arr[mid] === target)
return mid
else if(arr[mid] > target)
end = mid - 1
else if(arr[mid] < target)
start = mid + 1
}
return -1
};
while 문의 조건을 end가 start보다 클 때로 설정해놓고
mid는 start와 end의 중간(/2)으로 한다.
이제 조건문으로 값을 찾아주면 되는데, mid의 인덱스 값이 찾는 값과 같다면 인덱스를 리턴해준다.
( 중간 값이 찾는 값이기 때문)
그게 아니라면 end값을 줄여주고, start값을 늘려가며 중간 값을 탐색한다.
반복문이 종료되었는데도 값을 찾지 못한다면 찾는 값이 없는 것이기 때문에 -1을 리턴해준다.
console.log를 찍은 결과를 보면 더 쉽게 이해할 수 있다.
재귀함수로 해결한 코드이다.
//재귀함수
const binarySearch = function (arr, target) {
let startPoint = 0
let endPoint = arr.length -1
let midPoint = Math.floor((startPoint + endPoint) / 2)
const binary = (start, mid, end) => {
if(end < start)
return -1
mid = Math.floor((start + end) / 2)
if(arr[mid] === target)
return mid
else if(arr[mid] > target)
return binary(start, mid, mid-1)
else if(arr[mid] < target)
return binary(mid+1, mid, end)
}
return binary(startPoint, midPoint, endPoint)
}
위와 크게 다르지 않은 방법이지만 재귀함수를 이용했기 때문에 초기값, 재귀 안에서 호출되는 값을 각각 정의해줬다.
위는 배열이 이미 오름차순으로 정의되어 있고, 배열이 하나라서 빠른 이해가 가능했지만 두 개의 배열일 때의 문제는 해결 하지 못했다..
이 경우도 해결해서 곧 포스팅해야겠다.
이진 탐색(Binary Search) 알고리즘
이미 정렬되어 있는 배열에서 탐색 범위를 두 부분으로 나눠 절반씩 좁혀가며 필요한 부분에서만 탐색하도록 하는 방법
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
간단하게 up/down게임으로 값을 찾아내는 것이라고 생각하면 이해하기 쉽다.
위 배열에서 내가 찾는 값이 7이라고 할 때
1. 먼저 중간 값인 5와 비교한다 (5 < 7)
2. 찾는 값이 더 크므로 5과 10의 중간값인 8과 비교한다 (7 < 8)
3. 찾는 값이 더 작으므로 6과 8의 중간값인 7과 비교한다.
4. 찾는 값과 일치하므로 종료
이진 탐색을 하기 위한 선행조건은 배열의 값이 정렬되어 있어야 비교가 가능하다.
728x90
반응형
'junior developer :) > 알고리즘 & 코딩테스트' 카테고리의 다른 글
[알고리즘]퀵 정렬(Quick Sort)_JS (0) | 2022.12.12 |
---|---|
[알고리즘]삽입정렬(Insertion Sort)_JS (0) | 2022.12.06 |
알고리즘_분할정복 이용하여 거듭제곱 리턴하기 (0) | 2022.11.08 |
알고리즘_깊이우선탐색(DFS),너비우선탐색(BFS) / JS (2) | 2022.11.05 |
[알고리즘]오름차순으로 정렬하기_JS(버블정렬, 선택정렬) (0) | 2022.11.01 |