1 minute read

오름차순 정렬된 정수의 배열(arr)과 정수(target)를 입력받아 target의 인덱스를 리턴해야 한다.

입력 인자1 : arr

  • number 타입을 요소로 갖는 배열
  • arr[i]는 정수

인자2: target

  • number 타입의 정수

출력

  • number 타입을 리턴한다.

주의사항

  • 이진 탐색 알고리즘을 사용해야 한다.
  • 단순한 배열 순회로는 전부 통과할 수 없다
  • target이 없는 경우엔 -1을 리턴한다.

위 그림과 같이 입력된 배열을 반으로 나누고, 나눴을 때의 index element가 target보다 크므로 우측은 전부 버리고 좌측을 다시 반으로 나누고, 나눴을 때의 index element가 target이므로 그 index를 리턴한다.

const binarySearch = function (arr, target) {
  // 🟥 배열의 0번째 idx와 마지막 idx를 선언해준다
  let left = 0,
  let right = arr.length - 1; 
  // 🟥 left(시작)가 right(끝)와 같거나 작을동안 실행
	while (left <= right) {
	  // 🟥 middle(반으로 나눈 idx). 홀수일시 소숫점이 나오므로 parseInt로 정수로 뽑아온다
	  let middle = parseInt((right + left) / 2);
	  // 🟥 arr[middle] (arr을 반으로 나눈 idx)가 target이면 middle를 리턴한다.
	  if (arr[middle] === target) {
	    return middle;
	  }
	  // 🟥 target이 반으로 나눈 녀석보다 작다면 right는 middle - 1을 해준다
	  // (middle는 target이 아니란걸 확인했고 target이 그것보다 작으므로 필요없는 부분 삭제)
	  if (target < arr[middle]) {
	    right = middle - 1;
	  // 🟥 그게 아니고 target이 반으로 나눈 녀석보다 크다면 left는 middle + 1을 해준다
	  // (middle는 target이 아니란걸 확인했고 target이 그것보다 크므로 필요없는 부분 삭제)
	  } else {
	    left = middle + 1;
	  }
	}
	return -1;
};

Updated: