본문 바로가기

알고리즘/분류

이분탐색 솔루션

[1. 개요]

보통 매우 큰 범위를 갖는 어떤 값 중 최적 값을 찾을 때 유용하다.

  • N 이 [0, 1,000,000,000] 사이의 값일 때,
  • 어떤 식을 최대 혹은 최소로 만드는 N 을 구한다.
  • 완전 탐색 시, 시간 초과가 당연하다.
  • 그러나 이 범위에서 이분 탐색을 하면, 32번 이내로 찾을 수 있다.
    => 어떤 조건을 만족하는 최대 N 을 구해야 할 때
    => 먼저 중간 값을 찾고, 이 값을 주어진 식에 대입
    => 특정 조건을 만족하면 상위 구간에서 이분 탐색 진행
    => 만족하지 않으면 하위 구간에서 이분 탐색 진행

주의 할점

  • 범위와 반복문 조건이 중요하다. (구간 및, 반복문 조건 (등호 유무) 등이 다르면 틀린다.)
    => 구간은 보통 [a, b], 폐구간 이어야 한다.
    => 그래서 반복문 조건은 while (a <= b) 이어야 한다.
         ==> 구간이 [a, b) 이면, while (a < b);
    => 최적 값이 a 혹은 b 가 될 수 있기 때문이다.
  • 정리하면, N의 최대 값을 찾아야 할 때
    1. 구간: [a, b] 일 때
    2. 반복문: while (a <= b);
       => mid = (a+b) / 2
       => 조건    만족:    a = mid + 1
            => [mid+1, b]
       => 조건 불만족:    b = mid - 1
            => [a, mid-1]
       => mid 는 다음 반복문 전 여기서 검사했으므로 다음 탐색에서 제외해야 한다.

결정 문제로 바꿔서 풀어야 할 때

  • 어떤 최적값을 구해야 할 때,
  • 최적값을 이분 탐색으로 설정해가면서, 이 값을 통해 어떤 조건을 만족하는지 확인 해야 할 때 사용 할 수 있다.

 

[2. 예제]

'알고리즘 > 분류' 카테고리의 다른 글

스택 관련 문제 솔루션  (0) 2022.12.12
부분 합 솔루션  (0) 2022.12.11
탐욕법 솔루션  (0) 2022.12.10
동적계획법 솔루션  (0) 2022.12.07
분할 정복 솔루션  (0) 2022.12.06