πŸ“ μ½”λ”© ν…ŒμŠ€νŠΈ/Python

πŸ” μ •λ ¬κ³Ό 탐색 μ•Œκ³ λ¦¬μ¦˜ μ™„μ „ 정볡! (with Python)

Yeom.log 2025. 7. 1. 16:56
λ°˜μ‘ν˜•

 

πŸ” μ •λ ¬κ³Ό 탐색 μ•Œκ³ λ¦¬μ¦˜ μ™„μ „ 정볡! (Python 기반)

ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 자주 μ“°μ΄λŠ” μ •λ ¬(Sort) κ³Ό 탐색(Search) μ•Œκ³ λ¦¬μ¦˜!
Pythonμ—μ„œλŠ” 이듀을 μ–΄λ–»κ²Œ κ΅¬ν˜„ν•˜κ³  ν™œμš©ν•  수 μžˆμ„κΉŒμš”?
이번 ν¬μŠ€νŒ…μ—μ„œλŠ” μ„ ν˜• 탐색과 이진 탐색, 그리고 μ •λ ¬ ν•¨μˆ˜μ— λŒ€ν•΄ μ°¨κ·Όμ°¨κ·Ό μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.


πŸ“Œ μ •λ ¬ (Sorting)

βœ… μ •λ ¬μ΄λž€?

λ°°μ—΄/리슀트 μ•ˆμ— μžˆλŠ” μ›μ†Œλ“€μ„ νŠΉμ • 기쀀에 따라 μˆœμ„œλŒ€λ‘œ λ‚˜μ—΄ν•˜λŠ” 것

μ˜ˆμ‹œ:

L = [3, 8, 2, 7, 6, 10, 9]
# μ •λ ¬ κ²°κ³Ό → [2, 3, 6, 7, 8, 9, 10]

βœ… Python의 μ •λ ¬ 방법 2κ°€μ§€

1. sorted() ν•¨μˆ˜

  • μƒˆλ‘œμš΄ μ •λ ¬λœ 리슀트λ₯Ό λ°˜ν™˜ (원본 λ¦¬μŠ€νŠΈλŠ” κ·ΈλŒ€λ‘œ μœ μ§€)
L = [3, 8, 2, 7, 6, 10, 9]
L2 = sorted(L)
print(L2)  # [2, 3, 6, 7, 8, 9, 10]

2. .sort() λ©”μ„œλ“œ

  • 리슀트 자체λ₯Ό μ •λ ¬
L.sort()
print(L)  # [2, 3, 6, 7, 8, 9, 10]

πŸ” λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬

L.sort(reverse=True)
# λ˜λŠ”
sorted(L, reverse=True)

πŸ“š λ¬Έμžμ—΄ 리슀트 μ •λ ¬

L = ['abcd', 'xyz', 'spam']
sorted(L)  
# κ²°κ³Ό: ['abcd', 'spam', 'xyz']  # 사전 순

# λ¬Έμžμ—΄ 길이 순 μ •λ ¬
sorted(L, key=lambda x: len(x))  
# κ²°κ³Ό: ['xyz', 'spam', 'abcd']

πŸ”Ž 탐색 (Searching)

βœ… μ„ ν˜• 탐색 (Linear Search)

리슀트의 μ²˜μŒλΆ€ν„° λκΉŒμ§€ ν•˜λ‚˜μ”© μˆœμ„œλŒ€λ‘œ 비ꡐ

def linear_search(L, x):
    i = 0
    while i < len(L) and L[i] != x:
        i += 1
    return i if i < len(L) else -1
  • μ‹œκ°„ λ³΅μž‘λ„: O(n)
  • λ¦¬μŠ€νŠΈκ°€ μ •λ ¬λ˜μ–΄ μžˆμ§€ μ•Šμ•„λ„ μ‚¬μš© κ°€λŠ₯

βœ… 이진 탐색 (Binary Search)

λ¦¬μŠ€νŠΈκ°€ μ •λ ¬λ˜μ–΄ μžˆμ–΄μ•Όλ§Œ μ‚¬μš© κ°€λŠ₯
μ ˆλ°˜μ”© λ‚˜λˆ„μ–΄ λΉ„κ΅ν•˜λŠ” λ°©μ‹μœΌλ‘œ 맀우 λΉ λ₯΄κ²Œ 탐색

πŸ’‘ μ‹œκ°„ λ³΅μž‘λ„: O(log n)

πŸ“˜ μ˜ˆμ‹œ 문제

리슀트 L κ³Ό, κ·Έ μ•ˆμ—μ„œ μ°ΎμœΌλ €λŠ” μ›μ†Œ x κ°€ 인자둜 μ£Όμ–΄μ§ˆ λ•Œ, 
x 와 같은 값을 κ°€μ§€λŠ” μ›μ†Œμ˜ 인덱슀λ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜ solution() 을 μ™„μ„±ν•˜μ„Έμš”. 
L 은 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λ˜μ–΄ 있고, λ™μΌν•œ μ›μ†ŒλŠ” ν•œ 번만 λ“±μž₯ν•©λ‹ˆλ‹€.

βœ… 이진 탐색 κ΅¬ν˜„ μ½”λ“œ

def solution(L, x):
    lower = 0
    upper = len(L) - 1
    
    while lower <= upper:
        middle = (lower + upper) // 2
        if L[middle] == x:
            return middle
        elif L[middle] < x:
            lower = middle + 1
        else:
            upper = middle - 1

    return -1

πŸ“Œ μ˜ˆμ‹œ ν…ŒμŠ€νŠΈ

L = [2, 3, 5, 6, 9, 11, 15]

print(solution(L, 6))   # κ²°κ³Ό: 3
print(solution(L, 4))   # κ²°κ³Ό: -1

βœ… 마무리 μš”μ•½

μ•Œκ³ λ¦¬μ¦˜ 쑰건 μ‹œκ°„ λ³΅μž‘λ„ νŠΉμ§•

μ„ ν˜• 탐색 μ •λ ¬ X O(n) λ‹¨μˆœ, 느림
이진 탐색 μ •λ ¬ O (μ˜€λ¦„μ°¨μˆœ) O(log n) 빠름, 쀑간값 비ꡐ 반볡
μ •λ ¬ (sort) 리슀트 자체 λ³€κ²½ O(n log n) .sort() μ‚¬μš©
μ •λ ¬ (sorted) μƒˆ 리슀트 λ°˜ν™˜ O(n log n) sorted() μ‚¬μš©

 

#파이썬 #Python #μ•Œκ³ λ¦¬μ¦˜ #μ •λ ¬ #이진탐색 #μ„ ν˜•νƒμƒ‰  
#μ½”λ”©ν…ŒμŠ€νŠΈ #자료ꡬ쑰 #κ°œλ°œμžμ§€λ§μƒ #μ½”λ”©κΈ°μ΄ˆ  
#ν”„λ‘œκ·Έλž˜λ°κΈ°μ΄ˆ #PythonList #ITλΈ”λ‘œκ·Έ #곡뢀기둝

λ°˜μ‘ν˜•