suvera-dev πŸ₯¦

Algorithm) Binary Search λ³Έλ¬Έ

Algorithm/CodingTest - Python

Algorithm) Binary Search

suvera 2022. 4. 7. 10:36

이진탐색에 λ“€μ–΄κ°€κΈ°μ „

κ°€μž₯ κΈ°λ³Έ 탐색 방법인 순차 탐색에 λŒ€ν•΄μ„œ

살짝 닀루고 κ°€λ³΄μŸˆ !

 

μˆœμ°¨νƒμƒ‰(Sequential Search)μ΄λž€ ? 

리슀트 μ•ˆμ— μžˆλŠ” νŠΉμ •ν•œ 데이터λ₯Ό μ°ΎκΈ° μœ„ν•΄ μ•žμ—μ„œλΆ€ν„° 

데이터λ₯Ό ν•˜λ‚˜μ”© μ°¨λ‘€λŒ€λ‘œ ν™•μΈν•˜λŠ” 방법

 

- λ¦¬μŠ€νŠΈμ— νŠΉμ • κ°’μ˜ μ›μ†Œκ°€ μžˆλŠ”μ§€ 체크 

- 리슀트 μžλ£Œν˜•μ—μ„œ νŠΉμ •ν•œ 값을 κ°€μ§€λŠ” μ›μ†Œμ˜ 개수λ₯Ό μ„ΈλŠ”

count() λ©”μ„œλ“œμ˜ λ‚΄λΆ€μ—μ„œμ˜ μˆœμ°¨νƒμƒ‰ 

 

# μˆœμ°¨νƒμƒ‰ μ†ŒμŠ€μ½”λ“œ
def sequential_search(n, target, array):
    # 각 μ›μ†Œλ₯Ό ν•˜λ‚˜μ”© ν™•μΈν•˜λ©°
    for i in range(n):
        # ν˜„μž¬μ˜ μ›μ†Œκ°€ μ°Ύκ³ μžν•˜λŠ” μ›μ†Œμ™€ λ™μΌν•œ 경우
        if array[i] == target:
            return i + 1 # ν˜„μž¬μ˜ μœ„μΉ˜ λ°˜ν™˜ . μΈλ±μŠ€λŠ” 0λΆ€ν„° μ‹œμž‘ν•˜λ‹ˆκΉŒ 1λ”ν•˜κΈ° 

print("생성할 μ–Έμ†Œ 개수λ₯Ό μž…λ ₯ν•œ λ‹€μŒ ν•œμΉΈλ„κ³  찾을 λ¬Έμžμ—΄ μž…λ ₯")
input_data = input().split()
n = int(input_data[0])
target = input_data[1]

print("μ•žμ„œ 적은 μ›μ†Œ 개수만큼 λ¬Έμžμ—΄ μž…λ ₯ . ꡬ뢄은 띄어쓰기 ν•œμΉΈ")
array = input().split()

# μˆœμ°¨νƒμƒ‰ μˆ˜ν–‰ κ²°κ³Ό 좜λ ₯
print(sequential_search(n, target, array))

 

 

본둠인 이진탐색 μ‹œμž‘ -! 

 

이진탐색 : 반으둜 μͺΌκ°œλ©΄μ„œ νƒμƒ‰ν•˜κΈ° 

 λ°°μ—΄ λ‚΄λΆ€μ˜ 데이터가 μ •λ ¬λ˜μ–΄ μžˆμ–΄μ•Όλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€. 

탐색 λ²”μœ„λ₯Ό μ ˆλ°˜μ”© μ’ν˜€κ°€λ©° 데이터λ₯Ό νƒμƒ‰ν•œλ‹€! 

 

이진탐색은 μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜ 3개λ₯Ό μ‚¬μš©ν•˜λŠ”λ°

νƒμƒ‰ν•˜κ³ μžν•˜λŠ” λ²”μœ„μ˜ μ‹œμž‘μ , 끝점, 그리고 쀑간점이닀.

 

μ°ΎμœΌλ €λŠ” 데이터와 쀑간점 μœ„μΉ˜μ— μžˆλŠ” 데이터λ₯Ό 반볡적으둜

λΉ„κ΅ν•΄μ„œ μ›ν•˜λŠ” 데이터λ₯Ό 찾자 !


예λ₯Ό λ“€μ–΄, 

0 2 4 6 8 10 12 14 15 18

=> μ—¬κΈ°μ„œ μ‹œμž‘μ μ€ 0, 끝점은 18, 쀑간점은 [4.5] μœ„μΉ˜μ—μ„œ 

μ†Œμˆ«μ  자리λ₯Ό 버린 [4] μœ„μΉ˜μ˜ 8이 λœλ‹€ ! 

μ°ΎμœΌλ €κ³ ν•˜λŠ” 데이터가 4μΌλ•Œ 쀑간점인 8보닀 μž‘μœΌλ―€λ‘œ ,

8 μ΄ν›„μ˜ 값은 확인할 ν•„μš”κ°€ μ—†λ‹€. 

 

λ‹€μ‹œ, μ‹œμž‘μ μ€ 0 끝점은 6 쀑간점은

[1.5] -> [1] 인 2κ°€ λœλ‹€. 

쀑간점인 2보닀 4κ°€ ν¬λ―€λ‘œ, 2 μ΄ν•˜μ˜ 값은 확인할 ν•„μš”κ°€ μ—†λ‹€. 

 

λ‹€μ‹œ, μ‹œμž‘μ μ€ 4 끝점은 6이 λœλ‹€.

쀑간점이 μ°ΎμœΌλ €λŠ” 데이터와 λ™μΌν•˜λ―€λ‘œ 탐색을 μ’…λ£Œν•œλ‹€ !

 


μ΄λ ‡κ²Œ 전체 λ°μ΄ν„°μ˜ κ°œμˆ˜λŠ” 10개 μ§€λ§Œ, 이진탐색을 μ΄μš©ν•΄ 

총 3번의 μ°Έμƒ‰μœΌλ‘œ μ›μ†Œλ₯Ό μ°Ύμ•˜λ‹€. μ‹œκ°„λ³΅μž‘λ„λŠ” O(logN)이 λœλ‹€.

 

이진탐색 μ•Œκ³ λ¦¬μ¦˜μ€ ν•œ 단계λ₯Ό κ±°μΉ λ•Œλ§ˆλ‹€ ν™”μΈν•˜λŠ” μ›μ†Œκ°€ ν‰κ· μ μœΌλ‘œ

절반으둜 쀄어든닀. 

 

κ΅¬ν˜„ν•˜λŠ” 방법은 2가지가 μžˆλ‹€ !

1. μž¬κ·€ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜λŠ” 방법

2. λ‹¨μˆœν•˜κ²Œ λ°˜λ³΅λ¬Έμ„ μ΄μš©ν•˜λŠ” 방법

 


1. μž¬κ·€ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜λŠ” 방법

 

# 이진탐색 - μž¬κ·€μ 
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)

n, target = 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)

 

 

 

 

2. λ‹¨μˆœν•˜κ²Œ λ°˜λ³΅λ¬Έμ„ μ΄μš©ν•˜λŠ” 방법

 

# 이진탐색 μ†ŒμŠ€μ½”λ“œ - 반볡문
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
    return None

n, target = 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)

 

μ½”λ”©ν…ŒμŠ€νŠΈμ—μ„œ 이진탐색은 단골 문제 !

가급적 μ™Έμš°μž 

 


트리 자료ꡬ쑰 🌿

 

λ…Έλ“œμ™€ λ…Έλ“œμ˜ μ—°κ²°λ‘œ ν‘œν˜„ν•˜λ©° μ—¬κΈ°μ—μ„œ λ…Έλ“œλŠ” 

μ •λ³΄μ˜ λ‹¨μœ„λ‘œμ„œ μ–΄λ– ν•œ 정보λ₯Ό 가지고 μžˆλŠ” 개체둜 이해할 수 μžˆλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ΄λ‚˜ νŒŒμΌμ‹œμŠ€ν…œκ³Ό 같은 κ³³μ—μ„œ λ§Žμ€ μ–‘μ˜

데이터λ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ λͺ©μ μœΌλ‘œ μ‚¬μš©ν•œλ‹€.

 

- νŠΈλ¦¬λŠ” λΆ€λͺ¨λ…Έλ“œμ™€ μžμ‹λ…Έλ“œμ˜ κ΄€κ³„λ‘œ ν‘œν˜„λœλ‹€

- 트리의 μ΅œμƒλ‹¨ λ…Έλ“œλ₯Ό 루트 λ…Έλ“œλΌκ³  ν•œλ‹€

- 트리의 μ΅œν•˜λ‹¨ λ…Έλ“œλ₯Ό 단말 λ…Έλ“œλΌκ³  ν•œλ‹€

- νŠΈλ¦¬μ—μ„œ 일뢀λ₯Ό 뗴어내도 트리ꡬ쑰이며 이λ₯Ό μ„œλΈŒνŠΈλ¦¬λΌκ³  ν•œλ‹€

- νŠΈλ¦¬λŠ” 파일 μ‹œμŠ€ν…œκ³Ό 같이 계측적이고 

μ •λ ¬λœ 데이터λ₯Ό 닀루기에 μ ν•©ν•˜λ‹€ 

 


이진 탐색 트리 πŸ₯—

 

트리자료ꡬ쑰 μ€‘μ—μ„œ κ°€μž₯ κ°„λ‹¨ν•œ ν˜•νƒœκ°€ 이진 탐색 νŠΈλ¦¬μ΄λ‹€.

이진 탐색 νŠΈλ¦¬λž€ 이진 탐색이 λ™μž‘ν•  수 μžˆλ„λ‘ κ³ μ•ˆλœ

효율적인 탐색이 κ°€λŠ₯ν•œ μžλ£Œκ΅¬μ‘°μ΄λ‹€.

 

- λΆ€λͺ¨λ…Έλ“œλ³΄λ‹€ μ™Όμͺ½ μžμ‹ λ…Έλ“œκ°€ μž‘λ‹€

- λΆ€λͺ¨λ…Έλ“œλ³΄λ‹€ 였λ₯Έμͺ½ μžμ‹ λ…Έλ“œκ°€ 크닀 

 

μ™Όμͺ½ μžμ‹λ…Έλ“œ < λΆ€λͺ¨ λ…Έλ“œ < 였λ₯Έμͺ½ μžμ‹ λ…Έλ“œ

 


λΉ λ₯΄κ²Œ μž…λ ₯λ°›κΈ° πŸ‘€

 

이진탐색 λ¬Έμ œλŠ” μž…λ ₯ 데이터가 λ§Žκ±°λ‚˜ , 탐색 λ²”μœ„κ°€ λ§€μš°λ„“μ€ 편 ! 

μ΄λ ‡κ²Œ μž…λ ₯ λ°μ΄ν„°μ˜ κ°œμˆ˜κ°€ λ§Žμ€ λ¬Έμ œμ— input() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©° λ™μž‘ 속도가 λŠλ €μ„œ

μ‹œκ°„μ΄ˆκ³Όλ‘œ μ˜€λ‹΅ νŒμ •μ„ 받을 수 μžˆλ‹€ ! 

 

μž…λ ₯데이터가 λ§Žμ€ λ¬Έμ œλŠ” sys 라이브러의 readline() ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μž !

 

import sys
# ν•˜λ‚˜μ˜ λ¬Έμžμ—΄ 데이터 μž…λ ₯λ°›κΈ° 
input_data = sys.stdin.readline().rstrip()

print(input_data)

 

sys 라이브러리λ₯Ό μ‚¬μš©ν•  땐

ν•œμ€„ μž…λ ₯λ°›κ³ λ‚˜μ„œ rstrip() ν•¨μˆ˜λ₯Ό κΌ­ ν˜ΈμΆœν•΄μ•Όν•œλ‹€

readline() 으둜 μž…λ ₯ν•˜λ©° μž…λ ₯ν›„ μ—”ν„°κ°€ μ€„λ°”κΏˆ 기호둜 μž…λ ₯λ˜λŠ”λ°,

이 곡백 문자λ₯Ό μ œκ±°ν•˜κΈ° μœ„ν•΄μ„œλ‹€ ! 

 

 

깃헙에 정리해놓은 input ! 

 

GitHub - Suyeon9911/Algorithm-Study: μ•Œκ³ λ¦¬μ¦˜ 곡뢀 레포 πŸ¦‹

μ•Œκ³ λ¦¬μ¦˜ 곡뢀 레포 πŸ¦‹. Contribute to Suyeon9911/Algorithm-Study development by creating an account on GitHub.

github.com

 

'Algorithm > CodingTest - Python' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

Algorithm) Dynamic programming  (0) 2022.04.09
Algorithm ) Binary Search 문제  (0) 2022.04.07
Algorithm) Sorting 기본문제  (0) 2022.04.07
Algorithm) Sorting  (0) 2022.04.03
Algorithm) DFS/BFS μ‹€μ „λ¬Έμ œ  (0) 2022.04.02
Comments