이분 탐색(Binary-Search) with Python

유건우·2024년 9월 10일

코테준비

목록 보기
8/13

📖 문제 설명

문제 : https://www.acmicpc.net/problem/1920

  • N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오.

입력

  • 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -231 보다 크거나 같고 231보다 작다.

출력

  • M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다.




💡 요구사항 분석

  • N 과 M 의 값이 크기때문에 배열을 순회하면서 답을 찾게되면 시간초과가 발생할 것입니다.
  • 이분 탐색 알고리즘을 이용해야합니다.

이분 탐색 알고리즘

  • 정렬된 배열이나 리스트에서 특정 값을 효율적으로 찾기 위한 탐색 알고리즘입니다.
  • 이분 탐색은 배열을 절반씩 나누어 탐색 범위를 줄여나가므로 시간 복잡도가 매우 효율적입니다.

동작 원리

  • 배열의 가운데 값을 선택하고, 찾고자 하는 값과 비교합니다.
  • 찾고자 하는 값이 가운데 값보다 크면, 오른쪽 절반에서 다시 탐색을 시작합니다.
  • 찾고자 하는 값이 가운데 값보다 작으면, 왼쪽 절반에서 탐색을 시작합니다.
  • 이 과정을 반복하여 탐색 범위가 1개가 될 때까지 절반씩 줄여갑니다.
  • 찾고자 하는 값이 가운데 값과 일치하면 탐색을 종료하고 일치하지 않으면 값이 없다고 결론짓습니다.



🧑‍💻 코드 풀이

import sys

n = int(sys.stdin.readline())
search = list(map(int, sys.stdin.readline().split()))

m = int(sys.stdin.readline())
arr = list(map(int, sys.stdin.readline().split()))

search.sort()  # 탐색을 위해 정렬

for target in arr:
    start = 0
    end = n - 1
    flag = False

    for i in range(n):

        if start > end:  # 예외 처리 필요
            break

        mid = (start + end) // 2  # 중간값
        if search[mid] == target:  # 값이 같은 경우 바로 종료
            flag = True
            break
        elif search[mid] > target:  # 값이 큰경우 end 값을 감소
            end = mid - 1
        elif search[mid] < target:  # 값이 작은 경우 start 값을 증가
            start = mid + 1

    if flag:
        print(1)
    else:
        print(0)
profile
✅ 적당한 추상화를 찾아가는 개발자입니다.

0개의 댓글