algorithm/Binary Search

백준 1920 수 찾기

hw.kr 2022. 9. 22. 02:26

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

 

1920번: 수 찾기

첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들

www.acmicpc.net

📌 해결순서

이분탐색을 활용하는 문제중 가장 기본적인 문제라고 할 수 있다.

일단, 이분탐색은 데이터가 정렬 되어 있다고 가정하고 탐색을 시작한다.

다음과 같은 배열에서 2를 찾는 과정을 생각해보자

4 1 5 2 3

배열을 정렬 해준다,

1 2 3 4 5

1. 찾는 데이터가 배열에 있는 경우

target : 2

start : 0 / end : 4

 

비교 1. mid = (0 + 4) // 2 = 2

target = 2 < arr[mid] = 3 이기 때문에 mid 보다 뒤의 배열을 확인 할 필요가 없다. 배열은 이미 정렬되어 있고 배열의 중간값보다 뒤에 있는 값들은 target 값보다 클거기 때문에 비교하지 않고 시간복잡도를 줄인다.

따라서, end = mid - 1 = 1

 

비교2. mid = (0 + 1) // 2 = 0

target = 2 > arr[mid]  = 1 이기 때문에 mid 보다 앞의 배열을 확인 할 필요가 없다.

따라서, start = mid + 1 = 1

 

비교3. mid = (1 + 1) // 2 = 1

target = 2 == arr[mid] =2

따라서 목표값의 인덱스가 mid 인 1 임을 알수 있다.

 

2. 찾는 데이터가 배열에 없는 경우

target : 6

start : 0 / end : 4

 

비교 1.  mid = (0 + 4) // 2 = 2

target = 6 > arr[mid]  = 3

start = mid + 1 = 3

 

비교 2. mid = (3 + 4) // 2 = 3

target = 6 > arr[mid]  =  4

start = mid + 1 = 4

 

비교 3. mid = (4 + 4) // 2 = 4

target = 6 > arr[mid]  =  5

 

start = mid + 1 = 5 

start 인덱스가 end 인덱스 보다 크기 때문에 더이상의 탐색을 할 수가 없다. 따라서 찾는 값이 배열에 없음을 알수 있다.

반대의 경우,

예를 들어 찾는 값이 -1 이라고 생각하면 end 인덱스 값이 계속 줄어들다가 -1 이 되기 때문에 start 인덱스보다 작아지게 된다.

 

📌 코드

import sys
input = sys.stdin.readline


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


n = int(input())
lst = list(map(int, input().split()))
lst.sort()
m = int(input())
search_lst = list(map(int, input().split()))

for num in search_lst:
    result = bi_search(0, n - 1, num)
    print(result)

'algorithm > Binary Search' 카테고리의 다른 글

백준 2792 보석상자  (1) 2022.11.23
백준 6236 용돈 관리  (0) 2022.09.22
백준 3079 입국심사  (0) 2022.09.22
백준 2805 나무 자르기  (0) 2022.09.22
백준 1654 랜선 자르기  (0) 2022.09.22