[알고리즘] 이진 탐색 - JavaScript

2022. 7. 29. 14:05·알고리즘/풀이 힌트
반응형

0. 들어가며 

프로그래머스 순위 탐색 문제를 풀다가 이진 탐색을 실제로 사용해야 하는 상황이 발생해서 

정리를 해보았다. 

 

이진 탐색 자체에 대한 내용은 깊게 다루지 않고 어느 정도 이해한 상태라고 가정하고 작성한다. 

 

1. 사용 방식

[10, 30, 50, 60, 100, 200] 이란 배열이 있을 때, 기준 값으로 70이 주어지면 배열에서 70 이상의

값의 개수가 몇 개인지 확인할 때 사용하였다. 

 

2. 코드 구현

for (const item of query) {
    // item은 query의 값
    const key = item.split("and ").join("").split(" ");

    const score = parseInt(key.pop());
    const joinKey = key.join(" ");

    const value = map[joinKey];

    if (value) {
      let start = 0;
      let end = value.length;

      while (start < end) {
        const check = parseInt((start + end) / 2);

        if (value[check] < score) {
          start = check + 1;
        } else {
          end = check;
        }
      }

      answer.push(value.length - start);
    } else {
      answer.push(0);
    }
}

프로그래머스 문제를 풀 때 사용한 코드 그대로 가지고 왔다. 

 

let start = 0;
let end = value.length;
while (start < end) {
  const check = parseInt((start + end) / 2);
  if (value[check] < score) {
    start = check + 1;
  } else {
    end = check;
  }
}

핵심은 이 부분으로 

  • start : 시작 워치
  • end : 마지막 위치
  • check : 중간 위치
  • score : 기준 값
  • value : 배열

시작 위치와 마지막 위치를 선언하고 반복해서 중간값과 기준값을 비교하는 방식이다. 

 

중간 값이 기준보다 작은 경우 시작 위치를 중간 위치 + 1로 변경한다. 

+ 1을 한 이유는 중간 위치까지의 값은 이미 기준보다 작기 때문에 포함시키지 않기 위해서 + 1을 했다. 

 

그리고 중간 값이 더 클 경우에는 마지막 위치를 중간 위치로 변경한다. 

이번에 - 1을 하지 않은 이유는 어차피 / 2를 하면 마지막 위치는 포함되지 않기 때문에 굳이 하지 않았다. 

 

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 > 풀이 힌트' 카테고리의 다른 글

[알고리즘] Stack - JavaScript  (1) 2022.08.05
[알고리즘] 기준이 되는 배열로 만들 수 있는 모든 배열을 만들기  (1) 2022.08.01
[알고리즘] 배열을 반복해 순차적으로 값을 변경 및 수정하기  (1) 2022.07.28
[알고리즘] 배열( 순차 리스트)  (4) 2022.04.20
[알고리즘] 자바스크립트 9가지 코드 트릭  (5) 2022.04.19
'알고리즘/풀이 힌트' 카테고리의 다른 글
  • [알고리즘] Stack - JavaScript
  • [알고리즘] 기준이 되는 배열로 만들 수 있는 모든 배열을 만들기
  • [알고리즘] 배열을 반복해 순차적으로 값을 변경 및 수정하기
  • [알고리즘] 배열( 순차 리스트)
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    바질 키우기
    식물
    리얼학습일기
    redux
    Node.js
    영어회화
    CSS
    typescript
    네이버 부스트캠프
    webpack
    네트워크
    영어독학
    덤프
    알고리즘
    react
    javascript
    CCNA
    리얼클래스
    Babel
    타일러영어
    Docker
    프로그래머스
    타입스크립트
    ReactNative
    next.js
    자바스크립트
    다이소
    리액트
    ChatGPT
    바질
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[알고리즘] 이진 탐색 - JavaScript
상단으로

티스토리툴바