πŸ—οΈ Algorithm/🟦 이것이 취업을 μœ„ν•œ μ½”λ”©ν…ŒμŠ€νŠΈ

[이것이 취업을 μœ„ν•œ μ½”λ”© ν…ŒμŠ€νŠΈ] 이진 탐색(Binary Search)

Dbswnstjd 2022. 2. 17. 19:19

** 이진 νƒμƒ‰μ΄λž€ ?

λ‚΄λΆ€μ˜ 데이터가 μ •λ ¬λ˜μ–΄ μžˆμ„ λ•Œ μ‚¬μš©ν•  수 μžˆλŠ” μ•Œκ³ λ¦¬μ¦˜

  • 이미 μ •λ ¬λ˜μ–΄ μžˆλ‹€λ©΄ 데이터λ₯Ό 맀우 λΉ λ₯΄κ²Œ 찾을 수 μžˆλ‹€λŠ” νŠΉμ§•μ΄ 있음
  • 탐색 λ²”μœ„λ₯Ό μ ˆλ°˜μ”© μ’ν˜€κ°€λ©° 데이터λ₯Ό 탐색
  • μ‹œκ°„ λ³΅μž‘λ„ O(logN) 

κ΅¬ν˜„ 방법 

이진 탐색은 μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜ 3개λ₯Ό μ‚¬μš©ν•˜λŠ”λ° νƒμƒ‰ν•˜κ³ μž ν•˜λŠ” λ²”μœ„μ˜ μ‹œμž‘μ (start), 끝점(end), 쀑간점(mid)을 이용

μ°ΎμœΌλ €λŠ” 데이터와 쀑간점(mid)μœ„μΉ˜μ— μžˆλŠ” 데이터λ₯Ό 반볡적으둜 λΉ„κ΅ν•˜μ—¬ μ›ν•˜λŠ” 데이터λ₯Ό 찾음 

μ–Έμ œ μ¨μ•Όν•˜λ‚˜ ?

μ½”λ”© ν…ŒμŠ€νŠΈμ—μ„œμ˜ 이진 탐색 λ¬Έμ œλŠ” 탐색 λ²”μœ„κ°€ 큰 μƒν™©μ—μ„œμ˜ 탐색을 κ°€μ •ν•˜λŠ” λ¬Έμ œκ°€ λ§Žλ‹€. λ”°λΌμ„œ 탐색 λ²”μœ„κ°€ 2000λ§Œμ„ λ„˜μ–΄κ°€λ©΄ 이진 νƒμƒ‰μœΌλ‘œ λ¬Έμ œμ— μ ‘κ·Όν•΄λ³΄λŠ” 것이 쒋을 것 κ°™λ‹€. μ²˜λ¦¬ν•΄μ•Ό ν•  λ°μ΄ν„°μ˜ κ°œμˆ˜λ‚˜ 값이 1000만 λ‹¨μœ„ μ΄μƒμœΌλ‘œ λ„˜μ–΄κ°€λ©΄ 이진 탐색과 같이 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:
        return binary_search(array, target, start, mid-1)

    # μ€‘κ°„μ μ˜ 값보닀 찾고자 ν•˜λŠ” 값이 μž‘μ€ 경우 였λ₯Έμͺ½ 확인
    else:
        return binary_search(array, target, mid+1, end)

    # elif array[mid] > target:
    #      return binary_search(array, target, start, mid-1)
    # else:
    #      return binary_search(array, target, mid+1, end)
    

# n(μ›μ†Œμ˜ 개수)κ³Ό target(찾고자 ν•˜λŠ” λ¬Έμžμ—΄)을 μž…λ ₯λ°›κΈ°
n, target = list(map(int, input().split()))
# 전체 μ›μ†Œ μž…λ ₯λ°›κΈ°
array = list(map(int, input().split()))

# 이진 탐색 μˆ˜ν–‰ κ²°κ³Ό 좜λ ₯
result = binary_search(array, target, 0, n-1)
if result == None:
    print('μ›μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.')
else:
    print(result + 1)

 

이진 탐색 μ½”λ“œ(λ°˜λ³΅λ¬Έμ„ ν†΅ν•œ κ΅¬ν˜„)

# 이진 탐색 μ†ŒμŠ€μ½”λ“œ κ΅¬ν˜„ (반볡문)
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
        # elif mid > target:
        #   end = mid - 1
        # else:
        #   start = mid + 1
    return None

# n(μ›μ†Œμ˜ 개수)κ³Ό target(찾고자 ν•˜λŠ” λ¬Έμžμ—΄)을 μž…λ ₯λ°›κΈ°
n, target = list(map(int, input().split()))
# 전체 μ›μ†Œ μž…λ ₯λ°›κΈ°
array = list(map(int, input().split()))

# 이진 탐색 μˆ˜ν–‰ κ²°κ³Ό 좜λ ₯
result = binary_search(array, target, 0, n-1)
if result == None:
    print("μ›μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.")
else:
    print(result + 1)