const binarySearch = function (arr, target) {
// return arr.indexOf(target)
// 이진 탐색으로 왼쪽과 오른쪽으로 나눈다.
let left = 0,
right = arr.length - 1;
// 오른쪽이 왼쪽보다 크거나 같을때까지 반복한다.
while (left <= right) {
// 중간 = parseInt ((right+left) /2)
let middle = parseInt((right + left) / 2);
// 배열[중간] = 타겟이 같다면 ? 중간인덱스를 리턴함.
if (arr[middle] === target) {
return middle;
}
// 타겟이 배열[중간]보다 크다면 ?
if (target < arr[middle]) {
// 오른쪽은 중간 -1
right = middle - 1;
} else {
// 왼쪽에 중간 -1
left = middle + 1;
}
}
// 없으면 -1
return -1;
};
접근 패턴..
1. 문제 흐름 파악 -> 문제에서 나에게 어떤 상황이 주어졌는가?
* 무슨 문제일지 파악할때까지, 레퍼런스 보지않기. 간단히 어떤 전략으로 해결할지 생각
// arr.indexOf(target)
이것으로그냥 다 해결될거라생각했다. 하지만 이것이 무슨문제인가!? 알고리즘이다....
절반씩 줄여가며 찾아가기..
2. 레퍼런스보기 -> 1) 크게 코드를 쭈욱 읽어보고 큰 줄기를 파악 (어떤 로직과 설계를 썼는가.. )
2) RunJs를 통해 실시간으로 console.log를 찍고 컴퓨터와 하나하나 이야기해보기
3) 파악
4) 반복 & 복습(자기전에 간단히) 1~3번 사항을 다시 해봄. (하루에 처음접근, 주어진 시간동안 재귀..)
5) 아침에 일찍일어나서 다음 알고리즘 문제 풀기전에 같은 문제를 또 접근해봄.
6) 2일 혹은 3일 사이클로 문제는 누적하여 , 하루에 3문제
(버블sort 알고리즘, queue 처럼 먼저 배운것은 빼고 나중에.. )
7) 만약에 되면.. 주말에 토요일 3문제, 일요일 3문제 총 5문제에서 6문제 일주일 결산으로 반복.
