[알고리즘] 이진 탐색 - 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)
  • 태그

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

티스토리툴바