[알고리즘] 이분 탐색

2024. 7. 21. 23:14·Algorithm
목차
  1. 서론
  2.  
  3. 결정 문제와 이분 탐색의 활용처
  4.  
  5. 이분 탐색의 아이디어와 결과
  6.  
  7. 이분 탐색의 구현
  8.  
  9. 추천 알고리즘 문제

서론

이분 탐색 알고리즘은 이해하는 것은 어렵지 않은 알고리즘이라고 생각합니다. 주로 정렬되어 있는 배열에서 특정 값이 존재하는지 찾는 데 매우 유용한 알고리즘이고 선형탐색으로 O(N)의 시간복잡도가 걸리는 작업을 O(logN)으로 해결할 수 있습니다.

하지만 막상 구현에 들어가게 되면 맞게 구현한 것 같은데, 원하는 결과가 나오지 않는 경우가 종종 있어 검색을 통해 이분 탐색의 정확한 정의와 구현 방법을 배우고자 하였습니다. 그 과정에서 정리가 매우 잘 되어 있는 글을 찾게 되었고, 이번 글은 https://www.acmicpc.net/blog/view/109 을 올려 주신 jinhan814님의 글을 보고 정리한 글입니다.

해당 글에 정말 자세하게 이분 탐색 알고리즘에 대해 정리되어 있으니 참고하시면 큰 도움이 될 것 같습니다.

 

결정 문제와 이분 탐색의 활용처

이분 탐색은 결정 문제에서 답이 이분적일 때 사용할 수 있는 탐색 기법입니다.

결정 문제란 답이 T 또는 F으로 나누어지는 문제를 의미합니다.

예를 들어 1 ~ 50까지 오름차순으로 정렬된 배열에서 28을 찾는 문제를 해결해 봅시다.

이 경우 결정 문제를 arr[i] ≥ 28으로 잡게 된다면 i가 증가함에 따라 F, F, F, … , T, T… T가 될 것입니다.

결정 문제의 답이 두 구간으로 나뉘는 것을 이분적이라고 하며 이분 탐색을 통해 최종적으로 결정 문제의 답이 달라지는 경계를 찾을 수 있습니다.

 

이분 탐색의 아이디어와 결과

경계를 포함하는 [lo, hi] 구간을 잡아 길이를 절반씩 줄여나가며 lo, hi를 경계 지점에 위치하도록 합니다. 이분 탐색이 끝난 후의 결과는 lo 다음의 값은 hi가 되며, check(lo) ≠ check(hi)가 됩니다.

 

이분 탐색의 구현

  • check(lo) ≠ check(hi)가 되도록 lo, hi의 초기값을 설정합니다.
  • 우선 check(lo) ≠ check(hi)이기 때문에 [lo, hi]의 구간에 결정 문제의 답이 바뀌는 경계가 항상 존재함을 알 수 있습니다.
  • while (lo +1 < hi) 인 동안 check(lo) == check(mid)라면 lo = mid, check(hi) == check(mid)라면 hi = mid가 됩니다.→ 반복문을 탈출했다면 lo + 1 ≥ hi 인 경우이고 항상 lo+1 == hi을 만족하게 됩니다.
  • 범위를 줄여나가는 과정에서 check(lo) 값과 check(hi)가 변하지 않습니다.

이분 탐색이 끝나면 lo, hi는 결정 문제의 답이 바뀌는 경계에 위치하게 되고, 만약 결정 조건의 분포가 F~T이라면 가장 큰 F는 lo가 되고, 가장 작은 T는 hi가 되는 걸 알 수 있습니다.

 

추천 알고리즘 문제

백준 2805 나무자르기

https://www.acmicpc.net/problem/2805

백준 1477 휴게소세우기

https://www.acmicpc.net/problem/1477

백준 16434 드래곤앤던전

https://www.acmicpc.net/problem/16434

'Algorithm' 카테고리의 다른 글

[BOJ 14442 벽 부수고 이동하기 2]로 알아보는 조건이 있는 BFS  (0) 2024.08.04
[알고리즘] 🤪이죵과 다익스트라(Dijkstra) 알고리즘을 알아보자  (3) 2024.07.22
[BOJ 18222 투에-모스 문자열]을 이진법을 이용해 풀어보자  (0) 2024.07.21
[자료구조] 만두의 연결 리스트(Linked List)와 Soft Delete  (0) 2024.07.21
[알고리즘] 🤪이죵의 LCS(Longest Common Substring/Subsequence) 알고리즘을 알아보자🙌  (2) 2024.07.14
  1. 서론
  2.  
  3. 결정 문제와 이분 탐색의 활용처
  4.  
  5. 이분 탐색의 아이디어와 결과
  6.  
  7. 이분 탐색의 구현
  8.  
  9. 추천 알고리즘 문제
'Algorithm' 카테고리의 다른 글
  • [BOJ 14442 벽 부수고 이동하기 2]로 알아보는 조건이 있는 BFS
  • [알고리즘] 🤪이죵과 다익스트라(Dijkstra) 알고리즘을 알아보자
  • [BOJ 18222 투에-모스 문자열]을 이진법을 이용해 풀어보자
  • [자료구조] 만두의 연결 리스트(Linked List)와 Soft Delete
월월월월2
월월월월2
백엔드로 살아남기 입니다.
월월월월2
백엔드로 살아남기
월월월월2
전체
오늘
어제
  • 분류 전체보기 (64)
    • Spring (15)
    • TroubleShooting (2)
    • Infra (7)
    • Java (9)
    • Docker (7)
    • Database (1)
    • Algorithm (9)
    • React (8)
    • CS (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

링크

공지사항

인기 글

태그

비관적 락
Java
낙관적 락
countingsort
도커
사가 패턴
자바
dind
YAML
Docker Out of Docker
Docker in Docker
트러블슈팅
DevOps
spring
springboot
Docker
react testing library
MSA
Algorithm
23288
다중 usersdetail
스프링스케줄러
application.properties
스프링
점층적생성자패턴
자바빈즈패턴
연관 관계
JPA
#security
Spring Security

최근 댓글

최근 글

hELLO· Designed By정상우.v4.6.1
월월월월2
[알고리즘] 이분 탐색

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.