choi95 2021. 7. 25. 12:57

문제

μž„μ˜μ˜ N개의 μˆ«μžκ°€ μž…λ ₯으둜 μ£Όμ–΄μ§‘λ‹ˆλ‹€. N개의 수λ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œ λ‹€μŒ N개의 수 쀑 ν•œ 개의 수인 M이 μ£Όμ–΄μ§€λ©΄μ΄λΆ„κ²€μƒ‰μœΌλ‘œ M이 μ •λ ¬λœ μƒνƒœμ—μ„œ λͺ‡ λ²ˆμ§Έμ— μžˆλŠ”μ§€ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”.(단 쀑볡값은 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€)

 

μ½”λ“œ

function solution(target, arr) {
  let answer = 0;
  arr.sort((a, b) => {return a - b});
  let mid = Math.floor(arr.length/2);

  while(mid !== 0) {
    if(target === arr[mid]) {
      answer = mid + 1;
      break;
    } else {
      mid = Math.floor(mid/2);
    }
  }
  return answer;
}

let arr = [23, 87, 65, 12, 57, 32, 99, 81]
console.log(solution(32, arr));

 

μ˜€λ‹΅

이 λ¬Έμ œμ—μ„œλŠ” 처음 mid 값이 target 값보닀 μ»ΈκΈ° λ•Œλ¬Έμ— 전체 λ°°μ—΄μ˜ 길이의 반으둜 μͺΌκ°œμ„œ μ™Όμͺ½ ꡬ간을 νƒμƒ‰ν•˜λŠ” μœ„ λ°©λ²•μœΌλ‘œν’€λ Έμ§€λ§Œ λ§Œμ•½ mid값이 target 값보닀 μž‘μ€ κ²½μš°μ—λŠ” 였λ₯Έμͺ½ ꡬ간을 탐색해야 ν•˜κΈ° λ•Œλ¬Έμ— μœ„μ˜ ν’€μ΄λŠ” μ˜³μ§€ λͺ»ν•˜λ‹€.


이뢄 탐색(Binary Search)

  • 이뢄 νƒμƒ‰μ˜ μ£Όμš” 쑰건: 찾고자 ν•˜λŠ” 데이터가 μ €μž₯된 배열은 μ •λ ¬λ˜μ–΄ μžˆμ–΄μ•Ό 함
  • 처음 μ€‘κ°„μ˜ 값을 μž„μ˜μ˜ κ°’μœΌλ‘œ μ„ νƒν•˜μ—¬, κ·Έ κ°’κ³Ό 찾고자 ν•˜λŠ” κ°’μ˜ λŒ€μ†Œ 비ꡐ
  • λŒ€μ†Œ 비ꡐ ν›„, 탐색 λ²”μœ„λ₯Ό μ ˆλ°˜μ”© 쀄여가며 찾아감

μ½”λ“œ

function solution(target, arr) {
  let answer = 0;
  arr.sort((a, b) => {return a - b});
  let lt = 0; //μ™Όμͺ½ ꡬ간
  let rt = arr.length - 1; //였λ₯Έμͺ½ ꡬ간

  while(lt <= rt) { 
    let mid = Math.floor((lt + rt)/2);
    if(arr[mid] === target) {
      answer = mid + 1;
      break;
    }
    else if(arr[mid] > target) rt = mid - 1; //쀑간값이 target 값보닀 클 경우_였λ₯Έμͺ½ ꡬ간을 더 이상 확인할 ν•„μš”κ°€ μ—†μŒ
    else lt = mid + 1; //쀑간값이 target 값보닀 μž‘μ„ 경우_μ™Όμͺ½ ꡬ간을 더 이상 확인할 ν•„μš”κ°€ μ—†μŒ
  }
  return answer;
}

let arr = [23, 87, 65, 12, 57, 32, 99, 81]
console.log(solution(32, arr));