O(log N)
- Pre-processing - Sort if collection is unsorted.
- Binary Search - Using a loop or recursion to divide search space in half after each comparison.
- Post-processing - Determine viable candidates in the remaining space.
선형탐색
vs 이진탐색
target
을 비교하면서 이분탐색을 진행하면 된다./*
## Pseudo Code ##
1. 배열의 중간 값과 target을 비교 (이진탐색)
ㄴ start, mid, end index 값 변수 설정
2. while 반복문
ㄴ start 가 mid 같거나 보다 작을 때만 반복문 실행 (같거나는 nums의 길이가 1,2일 때)
ㄴ 1. mid value가 target과 같으면 => mid 리턴
ㄴ 2.
ㄴ mid value값이 target보다 크면 => end를 mid - 1로 변경 (앞쪽에서 찾자)
ㄴ mid value값이 target보다 작으면 => start를 mid + 1로 변경 (뒷쪽에서 찾자)
ㄴ 새로운 mid 구하기
*/
var search = function (nums, target) {
const getMid = (start, end) => Math.floor((start + end) / 2);
let start = 0;
let end = nums.length - 1;
let mid = getMid(start, end);
while (start <= end) {
const value = nums[mid];
if (value === target) {
return mid;
}
if (value > target) {
end = mid - 1;
} else {
start = mid + 1;
}
mid = getMid(start, end);
}
return -1;
};
일치하는 값
=> 제곱근 여부
로 변경/*
## Pseudo Code ##
ㄴ 이진탐색으로 중간 값이 제곱근이 되는지 비교한다.
ㄴ 제곱근이거나 가장 가까운 낮은 정수를 리턴해야함
0. 예외 처리 : x가 0 또는 1일 경우 x를 리턴
1. 변수 설정
ㄴ low : 1 (최소값 - 2, 3 일 경우 1이 정답)
ㄴ high : x - 1 (최대값 - x가 x의 제곱근이 될 수 없음)
ㄴ candidate : low와 high의 중간 정수 값
2. while 반복문
ㄴ low 가 high와 같거나 작을 때만 반복문 실행
ㄴ 1. candidate * candidate가 x와 같으면 candidate 리턴
ㄴ 2.
ㄴ candidate * candidate가 x보다 크면 => high를 candidate - 1로 변경 (앞쪽에서 찾자)
ㄴ candidate * candidate가 x보다 작으면 => low를 candidate + 1로 변경 (뒷쪽에서 찾자)
ㄴ 새로운 candidate 구하기
3. 반복문이 다 돌고 종료됬으면 candidate 리턴
*/
var mySqrt = function (x) {
if (x === 0 || x === 1) return x;
let low = 1;
let high = x - 1;
let candidate = Math.floor((low + high) / 2);
while (low <= high) {
const square = candidate * candidate;
if (square === x) return candidate;
if (square > x) {
high = candidate - 1;
} else {
low = candidate + 1;
}
candidate = Math.floor((low + high) / 2);
}
return candidate;
};
https://school.programmers.co.kr/learn/courses/30/lessons/43238
1 ~ 1,000,000,000
인 것을 확인하고 이진탐색을 생각했다./*
## Pseudo Code ##
- 이진탐색으로 구해보자.
- 모든 사람이 심사를 받는데 걸리는 예상최소시간 & 최대시간을 구하고 중간값부터 이진탐색으로 찾는다.
- 중간값(시간)이 소요됐을 때 처리가능한 사람 수를 구해서 그 실제 사람수보다
ㄴ 많으면 더 적은 시간으로 처리할 수 있는 것 : 중간값이 더 작아야함
ㄴ 적으면 더 많은 시간으로 처리할 수 있는 것 : 중간값이 더 커야함
- 이진탐색으로 전체를 돌고 나온 최소시간을 리턴
ㄴ 중간에 찾았다고 바로 리턴하면 안된다. 처리가능한 사람 수와 실제 사람 수가 일치하더라도 시간이 차이가 날 수 있음
1. 모든 사람이 심사를 받는데 걸리는 임의의 최소 시간, 최대 시간, 후보 시간 구하기
ㄴ fastest : 1 (제한 사항에 n 최소 1명, 심사관 최소 1, 걸리는 시간 최소 1)
ㄴ slowest : times 중 가장 높은 시간 * n (가장 오래걸리는 심사관한테 전부 받는 경우)
ㄴ candidate : fastest와 slowest 사이의 정수인 중간 값
2. while 반복문
ㄴ 조건 : fastest <= slowest
ㄴ candidate로 심사받을 수 있는 사람 수 judged 구하기
ㄴ judged와 n을 비교
ㄴ judged가 n보다 크면 => 더 적은 시간으로 처리가능하니까 slowest = candidate - 1
ㄴ judged가 n보다 작거나 같으면 => 더 많은 시간이 필요하니까 fastest = candidate + 1
3. candidate 리턴
*/
function solution(n, times) {
let fastest = Math.min(...times) * 1;
let slowest = Math.max(...times) * n;
let candidate = Math.floor((fastest + slowest) / 2);
while (fastest <= slowest) {
const judged = times.reduce((sum, time) => sum + Math.floor(candidate / time), 0);
if (judged < n) {
fastest = candidate + 1;
} else {
slowest = candidate - 1;
}
candidate = Math.floor((fastest + slowest) / 2);
}
return fastest;
}
https://leetcode.com/explore/learn/card/binary-search/
https://leetcode.com/problems/binary-search/
https://leetcode.com/problems/sqrtx/
https://school.programmers.co.kr/learn/courses/30/lessons/43238