λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Knowledge/Algorithm

[Algorithm]μˆœμ°¨νƒμƒ‰ μ•Œκ³ λ¦¬μ¦˜ μ™„λ²½ κ°€μ΄λ“œ: 파이썬 μ½”λ“œμ™€ ν•¨κ»˜ν•˜λŠ” 단계별 μ„€λͺ…

by YJ Dev 2024. 7. 26.
728x90
λ°˜μ‘ν˜•
SMALL

μˆœμ°¨νƒμƒ‰ μ•Œκ³ λ¦¬μ¦˜μ€ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 데이터λ₯Ό μ°ΎλŠ” κ°„λ‹¨ν•˜μ§€λ§Œ κ°•λ ₯ν•œ λ°©λ²•μž…λ‹ˆλ‹€. 였늘 ν¬μŠ€νŒ…μ—μ„œλŠ” μˆœμ°¨νƒμƒ‰μ˜ κΈ°λ³Έ κ°œλ…κ³Ό 이λ₯Ό 파이썬으둜 κ΅¬ν˜„ν•˜λŠ” 방법을 μ†Œκ°œν•©λ‹ˆλ‹€. 이 글을 톡해 μ•Œκ³ λ¦¬μ¦˜μ˜ 이해도λ₯Ό 높이고, μ‹€μ „μ—μ„œ ν™œμš©ν•  수 μžˆλŠ” μ‹€μš©μ μΈ μ½”λ“œλ₯Ό μ΅ν˜€λ³΄μ„Έμš”.

파이썬 μˆœμ°¨νƒμƒ‰ μ•Œκ³ λ¦¬μ¦˜


01. μˆœμ°¨νƒμƒ‰ μ•Œκ³ λ¦¬μ¦˜μ˜ κΈ°λ³Έ κ°œλ…πŸ“š

μˆœμ°¨νƒμƒ‰μ΄λž€?

μˆœμ°¨νƒμƒ‰(Sequential Search) μ•Œκ³ λ¦¬μ¦˜μ€ 데이터 리슀트λ₯Ό μ²˜μŒλΆ€ν„° λκΉŒμ§€ 순차적으둜 νƒμƒ‰ν•˜μ—¬ μ›ν•˜λŠ” 값을 μ°ΎλŠ” λ°©λ²•μž…λ‹ˆλ‹€. 이 방법은 데이터가 μ •λ ¬λ˜μ–΄ μžˆμ§€ μ•Šμ•„λ„ μ‚¬μš© κ°€λŠ₯ν•˜λ©°, κ΅¬ν˜„μ΄ κ°„λ‹¨ν•©λ‹ˆλ‹€.

μˆœμ°¨νƒμƒ‰μ˜ λ™μž‘ 원리:

  1. 리슀트의 첫 번째 μš”μ†ŒλΆ€ν„° μˆœμ„œλŒ€λ‘œ μ›ν•˜λŠ” 값을 μ°ΎλŠ”λ‹€.
  2. 찾은 값을 λ°œκ²¬ν•˜λ©΄ 검색을 μ’…λ£Œν•œλ‹€.
  3. 리슀트의 λκΉŒμ§€ 검색해도 값을 찾지 λͺ»ν•˜λ©΄ 값이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  νŒλ‹¨ν•œλ‹€.

예제:

리슀트 [3, 5, 2, 9, 7]μ—μ„œ κ°’ 9λ₯Ό μ°ΎλŠ” 경우, 첫 번째 3λΆ€ν„° μˆœμ„œλŒ€λ‘œ λΉ„κ΅ν•˜μ—¬ 9λ₯Ό 찾을 λ•ŒκΉŒμ§€ 계속 μ§„ν–‰ν•©λ‹ˆλ‹€.

μ‹œκ°„ λ³΅μž‘λ„:

μˆœμ°¨νƒμƒ‰μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” ν‰κ· μ μœΌλ‘œ O(n)μž…λ‹ˆλ‹€. μ΄λŠ” μ΅œμ•…μ˜ 경우 λͺ¨λ“  μš”μ†Œλ₯Ό 탐색해야 ν•  μˆ˜λ„ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.


02. 파이썬으둜 μˆœμ°¨νƒμƒ‰ κ΅¬ν˜„ν•˜κΈ°πŸ–₯️

κΈ°λ³Έ κ΅¬ν˜„:

이제 μˆœμ°¨νƒμƒ‰ μ•Œκ³ λ¦¬μ¦˜μ„ 파이썬으둜 κ΅¬ν˜„ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. μ•„λž˜λŠ” μˆœμ°¨νƒμƒ‰μ„ μˆ˜ν–‰ν•˜λŠ” κ°„λ‹¨ν•œ 파이썬 μ½”λ“œμž…λ‹ˆλ‹€.

def sequential_search(arr, target):
    """
    μˆœμ°¨νƒμƒ‰ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ target 값을 arr λ¦¬μŠ€νŠΈμ—μ„œ μ°ΎμŠ΅λ‹ˆλ‹€.
    
    :param arr: 탐색할 리슀트 (List[int])
    :param target: 찾고자 ν•˜λŠ” κ°’ (int)
    :return: 값이 μ‘΄μž¬ν•˜λ©΄ 인덱슀, 그렇지 μ•ŠμœΌλ©΄ -1
    """
    # 리슀트의 각 μš”μ†Œλ₯Ό 순차적으둜 νƒμƒ‰ν•©λ‹ˆλ‹€.
    for index, value in enumerate(arr):
        # ν˜„μž¬ μš”μ†Œκ°€ 찾고자 ν•˜λŠ” κ°’κ³Ό μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.
        if value == target:
            # 값이 발견되면 ν•΄λ‹Ή μš”μ†Œμ˜ 인덱슀λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
            return index
    # 리슀트의 λκΉŒμ§€ νƒμƒ‰ν–ˆμœΌλ‚˜ 값을 λ°œκ²¬ν•˜μ§€ λͺ»ν•œ 경우 -1을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
    return -1

# 탐색할 λ¦¬μŠ€νŠΈμ™€ 찾고자 ν•˜λŠ” 값을 μ •μ˜ν•©λ‹ˆλ‹€.
example_list = [3, 5, 2, 9, 7]
search_value = 9

# μˆœμ°¨νƒμƒ‰ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ 값을 μ°ΎμŠ΅λ‹ˆλ‹€.
result = sequential_search(example_list, search_value)

# 검색 결과에 따라 λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.
if result != -1:
    # 값이 λ¦¬μŠ€νŠΈμ— μ‘΄μž¬ν•˜λŠ” 경우, ν•΄λ‹Ή 인덱슀λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.
    print(f"κ°’ {search_value}은(λŠ”) 리슀트의 인덱슀 {result}에 μ‘΄μž¬ν•©λ‹ˆλ‹€.")
else:
    # 값이 λ¦¬μŠ€νŠΈμ— μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우, μ‘΄μž¬ν•˜μ§€ μ•ŠμŒμ„ 좜λ ₯ν•©λ‹ˆλ‹€.
    print(f"κ°’ {search_value}은(λŠ”) λ¦¬μŠ€νŠΈμ— μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.")

μ½”λ“œ μ„€λͺ…:

  • sequential_search ν•¨μˆ˜λŠ” λ¦¬μŠ€νŠΈμ™€ 찾고자 ν•˜λŠ” 값을 μž…λ ₯λ°›μ•„ 리슀트λ₯Ό 순차적으둜 νƒμƒ‰ν•©λ‹ˆλ‹€.
  • 값이 발견되면 κ·Έ κ°’μ˜ 인덱슀λ₯Ό λ°˜ν™˜ν•˜λ©°, 리슀트의 λκΉŒμ§€ 검색해도 값을 찾지 λͺ»ν•˜λ©΄ -1을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

ν…ŒμŠ€νŠΈ 및 κ²°κ³Ό:

μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄, 9κ°€ 리슀트의 인덱슀 3에 μ‘΄μž¬ν•œλ‹€λŠ” κ²°κ³Όκ°€ 좜λ ₯λ©λ‹ˆλ‹€. λ‹€μ–‘ν•œ μž…λ ₯κ°’μœΌλ‘œ μ½”λ“œλ₯Ό ν…ŒμŠ€νŠΈν•˜μ—¬ μ•Œκ³ λ¦¬μ¦˜μ˜ 정확성을 확인해 λ³΄μ„Έμš”.


03. μˆœμ°¨νƒμƒ‰μ˜ ν™œμš© μ‚¬λ‘€πŸ“Š

μ‹€μ œ 문제 ν•΄κ²°:

μˆœμ°¨νƒμƒ‰μ€ μ •λ ¬λ˜μ§€ μ•Šμ€ λ°μ΄ν„°μ—μ„œ 값을 μ°ΎλŠ” 데 μœ μš©ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ‚¬μš©μžμ˜ μž…λ ₯을 κ²€μƒ‰ν•˜κ±°λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κ°„λ‹¨ν•œ 쑰회 μž‘μ—…μ„ μˆ˜ν–‰ν•  λ•Œ μœ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€λ₯Έ μ•Œκ³ λ¦¬μ¦˜κ³Όμ˜ 비ꡐ:

  • 이진 탐색: μ •λ ¬λœ λ°μ΄ν„°μ—μ„œλ§Œ μ‚¬μš©ν•  수 있으며, μ‹œκ°„ λ³΅μž‘λ„κ°€ O(log n)으둜 더 λΉ λ¦…λ‹ˆλ‹€.
  • ν•΄μ‹œ ν…Œμ΄λΈ”: λ°μ΄ν„°μ˜ 검색 속도가 μƒμˆ˜ μ‹œκ°„μ— κ°€κΉŒμ›Œ 훨씬 λΉ λ¦…λ‹ˆλ‹€. ν•˜μ§€λ§Œ κ΅¬ν˜„μ΄ λ³΅μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

728x90
λ°˜μ‘ν˜•