[Algorithm] Binary Search

Updated:

๐Ÿ“ฃ
๋ณธ ํฌ์ŠคํŠธ๋Š” โ€˜์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌโ€™์„ ๊ณต๋ถ€ํ•˜๊ณ  ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค :)
click > (์ด์ฝ”ํ…Œ 2021) ์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ

Binary Search

์ด๋ก 

์ˆœ์ฐจ ํƒ์ƒ‰(Sequential Search)์€ ๋ฆฌ์ŠคํŠธ ์•ˆ์— ์žˆ๋Š” ํŠน์ •ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์•ž์—์„œ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์ด์ง„ ํƒ์ƒ‰(Binary Search)๋Š” ๋ฐฐ์—ด ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ์„ ๋•Œ, ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜ 3๊ฐœ(์‹œ์ž‘์ , ๋์ , ์ค‘๊ฐ„์ )์„ ์ด์šฉํ•˜์—ฌ ์ค‘๊ฐ„์ ๊ณผ ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋น„๊ตํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋˜ํ•œ ์ด์ง„ ํƒ์ƒ‰ ๋ฌธ์ œ๋Š” ํƒ์ƒ‰๋ฒ”์œ„๊ฐ€ ํŠผ ์ƒํ™ฉ์—์„œ ํƒ์ƒ‰์„ ๊ฐ€์ •ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋งŽ๋‹ค. ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ 2000๋งŒ์„ ๋„˜์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ ์ด์ง„ํƒ์ƒ‰์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ด์ง„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•œ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น  ๋•Œ๋งˆ๋‹ค ํ™•์ธํ•˜๋Š” ์›์†Œ๊ฐ€ ํ‰๊ท ์ ์œผ๋กœ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๋ณต์žก๋„๋Š” 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)

# 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
    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)

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ

ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„ ๋ฐ์ดํ„ฐ๋ฅผ ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ์ €์žฅํ•ด์„œ ์ด์ง„ ํƒ์ƒ‰๊ณผ ๊ฐ™์€ ํƒ์ƒ‰ ๊ธฐ๋ฒ•์„ ์ด์šฉํ•ด ๋น ๋ฅด๊ฒŒ ํƒ์ƒ‰์„ ํ•œ๋‹ค. ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋Š” ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘์—์„œ๋„ ์ด์ง„ ํƒ์ƒ‰์ด ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณ ์•ˆ๋œ, ํšจ์œจ์ ์ธ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

image

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง„๋‹ค.

  • ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์ž‘๋‹ค.
  • ๋ถ€๋ชจ ๋…ธ๋“œ๋ณด๋‹ค ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ๊ฐ€ ํฌ๋‹ค.

์‹ค์ „ ๋ฌธ์ œ

[์‹ค์ „๋ฌธ์ œ 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
    return None

# N(๊ฐ€๊ฒŒ์˜ ๋ถ€ํ’ˆ ๊ฐœ์ˆ˜) ์ž…๋ ฅ
n = int(input())
# ๊ฐ€๊ฒŒ์— ์žˆ๋Š” ์ „์ฒด ๋ถ€ํ’ˆ ๋ฒˆํ˜ธ๋ฅผ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅ
array = list(map(int, input().split()))
array.sort() # ์ด์ง„ ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์ „์— ์ •๋ ฌ ์ˆ˜ํ–‰
# M(์†๋‹˜์ด ํ™•์ธ ์š”์ฒญํ•œ ๋ถ€ํ’ˆ ๊ฐœ์ˆ˜) ์ž…๋ ฅ
m = int(input())
# ์†๋‹˜์ด ํ™•์ธ ์š”์ฒญํ•œ ์ „์ฒด ๋ถ€ํ’ˆ ๋ฒˆํ˜ธ๋ฅผ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅ
x = list(map(int, input().split()))

# ์†๋‹˜์ด ํ™•์ธ ์š”์ฒญํ•œ ๋ถ€ํ’ˆ ๋ฒˆํ˜ธ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธ
for i in x:
    # ํ•ด๋‹น ๋ถ€ํ’ˆ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
    result = binary_search(array, i, 0, n - 1)
    if result != None:
        print('yes', end=' ')
    else:
        print('no', end=' ')
  • ๊ณ„์ˆ˜ ์ •๋ ฌ์„ ํ™œ์šฉํ•˜์—ฌ ๊ตฌํ˜„
# N(๊ฐ€๊ฒŒ์˜ ๋ถ€ํ’ˆ ๊ฐœ์ˆ˜) ์ž…๋ ฅ
n = int(input())
array = [0] * 1000001

# ๊ฐ€๊ฒŒ์— ์žˆ๋Š” ์ „์ฒด ๋ถ€ํ’ˆ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„์„œ ๊ธฐ๋ก
for i in input().split():
    array[int(i)] = 1

# M(์†๋‹˜์ด ํ™•์ธ ์š”์ฒญํ•œ ๋ถ€ํ’ˆ ๊ฐœ์ˆ˜) ์ž…๋ ฅ
m = int(input())
# ์†๋‹˜์ด ํ™•์ธ ์š”์ฒญํ•œ ์ „์ฒด ๋ถ€ํ’ˆ ๋ฒˆํ˜ธ๋ฅผ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅ
x = list(map(int, input().split()))

# ์†๋‹˜์ด ํ™•์ธ ์š”์ฒญํ•œ ๋ถ€ํ’ˆ ๋ฒˆํ˜ธ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธ
for i in x:
    # ํ•ด๋‹น ๋ถ€ํ’ˆ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
    if array[i] == 1:
        print('yes', end=' ')
    else:
        print('no', end=' ')
  • ์ง‘ํ•ฉ ์ž๋ฃŒํ˜•์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„
# N(๊ฐ€๊ฒŒ์˜ ๋ถ€ํ’ˆ ๊ฐœ์ˆ˜) ์ž…๋ ฅ
n = int(input())
# ๊ฐ€๊ฒŒ์— ์žˆ๋Š” ์ „์ฒด ๋ถ€ํ’ˆ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„์„œ ์ง‘ํ•ฉ(Set) ์ž๋ฃŒํ˜•์— ๊ธฐ๋ก
array = set(map(int, input().split()))

# M(์†๋‹˜์ด ํ™•์ธ ์š”์ฒญํ•œ ๋ถ€ํ’ˆ ๊ฐœ์ˆ˜) ์ž…๋ ฅ
m = int(input())
# ์†๋‹˜์ด ํ™•์ธ ์š”์ฒญํ•œ ์ „์ฒด ๋ถ€ํ’ˆ ๋ฒˆํ˜ธ๋ฅผ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅ
x = list(map(int, input().split()))

# ์†๋‹˜์ด ํ™•์ธ ์š”์ฒญํ•œ ๋ถ€ํ’ˆ ๋ฒˆํ˜ธ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธ
for i in x:
    # ํ•ด๋‹น ๋ถ€ํ’ˆ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
    if i in array:
        print('yes', end=' ')
    else:
        print('no', end=' ')

[์‹ค์ „๋ฌธ์ œ 2] ๋–ก๋ณถ์ด ๋–ก ๋งŒ๋“ค๊ธฐ

n, m = map(int, input().split())
array = list(map(int, input().split()))

start = 0
end = max(array)

answer = 0
while start <= end:
		mid = (start + end) // 2 
		value = 0
		for a in array:
				if a > mid:
						value += (a - mid)
		if value < m :
				end = mid - 1
		else:
				answer = mid # ์ตœ๋Œ€ํ•œ ๋œ ์ž˜๋ž์„ ๋•Œ๊ฐ€ ์ •๋‹ต์ด๋ฏ€๋กœ, ์šฐ์„  answer์— ์ €์žฅ
				start = mid + 1

print(answer)

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ