코딩관계론

[프로그래머스] 수 찾기 본문

개발/알고리즘

[프로그래머스] 수 찾기

개발자_티모 2023. 3. 8. 23:30
반응형

아이디어 도출 방법

주어진 문제는 search배열(n)에서 특정 숫자(m)를 찾는 문제였다. 하지만 배열의 길이가 크고, 찾고자 하는 특정 숫자가 많아지면 이중반복문으로는 해결하기 어렵다.

 

따라서 이중 반복문을 제거하고, 주어진 배열에서 더 빠르게 탐색할 수 있는 알고리즘이 필요한데 이것이 이분 탐색이다.

이분 탐색은 기존의 O(n)의 시간 복잡도를 O(logn)으로 줄여준다.  이런 방법을 사용한다면 기존의 O(n*n)의 시간 복잡도에서 O(nlogn) + O(mlogn)으로 개선할 수 있다.

 

또한 이분 탐색을 하기 전 필수적으로 수행되어야 할 것은 '특정 배열'(주어진 숫자를 찾고자 하는 배열)이 정렬되어 있어야 한다.

 

최종 결과

n = int(input())
search = list(map(int, input().split()))

m = int(input())
arr = list(map(int, input().split()))

#필수조건 찾고자 하는 필드는 항상 오름차순으로 정렬됨
search.sort()

for target in arr:
    lo = -1
    hi = n-1

    """반복문 불변식1 lo < hi
       반분문 불변식2 a[lo] < x <= a[hi]
    """

    #for문을 탈출하면 lo + 1 = hi가 됨 (즉 lo hi)이 상태임
    #반복문 불면식이 성립한다.
    while lo + 1 < hi:
        mid = int((lo + hi) / 2)
        
        if search[mid] < target:
            lo = mid
        else:
            hi = mid

    if search[hi] == target:
        print(1)
    else:
        print(0)

 

후기

오랫만에 이분탐색 문제를 풀어보았고, 실력을 더 올리기 위해 프로그램에 증명을 도입해봤다.

 

한가지 재미난 점은 set을 이용해 푼 후기가 있었다. set은 시간 복잡도가 O(1)인데 어떻게 구현됐는지 나중에 블로그에 글을 남겨야겠다(https://bjwan-career.tistory.com/53)

반응형