[PS] BOJ 1920 수 찾기

Speedwell🍀·2023년 5월 2일
0

PS

목록 보기
3/16

문제 링크


📌 기본적인 이진탐색 문제

  1. 이진탐색 알고리즘을 사용할 때 데이터는 정렬된 상태여야 하기 때문에, N개의 정수 A[1], ..., A[N]을 먼저 정렬한다.

  2. 리스트 A를 시작점/끝점/중간점으로 나눠 탐색 범위를 절반씩 좁혀가며 데이터를 탐색한다.

    • 찾으려는 데이터와 중간점 위치에 있는 데이터를 반복적으로 비교해서 원하는 데이터를 찾는다.

    • 시간복잡도 O(logN)


이진탐색 재귀함수

def binary_search(array, target, start, end):
	if start > end:
    	return None
    mid = (start + end) // 2
    # 찾은 경우 중간점 인덱스 반환
    if array[mid] == target:
    	return mid
    # 중간점의 값보다 찾고자 하는 값이 작은 경우 왼쪽 확인
    elif array[mid] > target:
    	retrun binary_search(array, target, start, mid - 1)
	# 중간점의 값보다 찾고자 하는 값이 큰 경우 오른쪽 확인
    else:
    	return binary_search(array, target, mid + 1, end)

위의 알고리즘을 사용하면 문제 해결 가능


전체 코드

def binary_search(array, target, start, end):
    while start <= end:
        mid = (start + end) // 2
        
        if array[mid] == target:
            return mid
        elif array[mid] > target:
            end = mid - 1
        else:
            start = mid + 1
    return None

n = int(input())
a = list(map(int, input().split()))
m = int(input())
b = list(map(int, input().split()))
cnt = 0

a.sort()

for i in range(m):
    result = binary_search(a, b[i], 0, n - 1)
    
    if result == None:
        print("0")
    else:
        print("1")

0개의 댓글