suvera-dev ๐Ÿฅฆ

Algorithm ) Binary Search ๋ฌธ์ œ ๋ณธ๋ฌธ

Algorithm/CodingTest - Python

Algorithm ) Binary Search ๋ฌธ์ œ

suvera 2022. 4. 7. 19:15

ํŒŒ์ด์ฌ ์ด์ง„ ํƒ์ƒ‰ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 

 

bisect_left(a,x) : ์ •๋ ฌ๋œ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ฐฐ์—ด a์— x๋ฅผ ์‚ฝ์ž…ํ•  ๊ฐ€์žฅ ์™ผ์ชฝ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜

bisect_right(a,x) : ์ •๋ ฌ๋œ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ฐฐ์—ด a์— x๋ฅผ ์‚ฝ์ž…ํ•  ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ˜ํ™˜

from bisect import bisect_left, bisect_right

=> ๊ฐ’์ด ํŠน์ • ๋ฒ”์œ„์— ์†ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ

from bisect import bisect_left, bisect_right

# ๊ฐ’์ด left_value, right_value์ธ ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ 
def count_by_range(a, left_value, rignt_value):
	right_index = bisect_right(a, right_value)
    left_index = bisect_left(a, left_value)
    return right_index - left_index

ํŒŒ๋ผ๋ฉ”ํŠธ๋ฆญ ์„œ์น˜

 

์ตœ์ ํ™” ๋ฌธ์ œ๋ฅผ ๊ฒฐ์ • ๋ฌธ์ œ๋กœ ๋ฐ”๊พธ์–ด ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ

=> ์ด์ง„ํƒ์ƒ‰์œผ๋กœ ํ•ด๊ฒฐํ•ด๋ณด์ž !


๋ฌธ์ œ 1. ๋ถ€ํ’ˆ ์ฐพ๊ธฐ

 

์ „์ž ๋งค์žฅ์—๋Š” ๋ถ€ํ’ˆ์ด N๊ฐœ ์žˆ๋‹ค. ๊ฐ ๋ถ€ํ’ˆ์€ ์ •์ˆ˜ ํ˜•ํƒœ์˜ ๊ณ ์œ ํ•œ ๋ฒˆํ˜ธ๊ฐ€ ์žˆ๋‹ค.

์–ด๋Š ๋‚  ์†๋‹˜์ด M๊ฐœ์˜ ์ข…๋ฅ˜์˜ ๋ถ€ํ’ˆ์„ ๋Œ€๋Ÿ‰์œผ๋กœ ๊ตฌ๋งคํ•˜๊ฒ ๋‹ค๋ฉฐ ๋‹น์ผ ๋‚  ๊ฒฌ์ ์„œ๋ฅผ ์š”์ฒญํ–ˆ๋‹ค.

์†๋‹˜์ด ๋ฌธ์˜ํ•œ ๋ถ€ํ’ˆ M๊ฐœ ์ข…๋ฅ˜๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•ด์„œ ๊ฒฌ์ ์„œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

์ด๋•Œ ๊ฐ€๊ฒŒ ์•ˆ์— ๋ถ€ํ’ˆ์ด ๋ชจ๋‘ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์ž.

 

์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ€๊ฒŒ์˜ ๋ถ€ํ’ˆ์ด ์ด 5๊ฐœ์ผ ๋•Œ ๋ถ€ํ’ˆ ๋ฒˆํ˜ธ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๊ณ  ํ•˜์ž.

N=5 [8, 3, 7, 9, 2]

์†๋‹˜์€ ์ด 3๊ฐœ์˜ ๋ถ€ํ’ˆ์ด ์žˆ๋Š”์ง€ ํ™•์ธ ์š”์ฒญํ–ˆ๋Š”๋ฐ ๋ถ€ํ’ˆ ๋ฒˆํ˜ธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

M=3 [5, 7, 9]

์ด๋•Œ ์†๋‹˜์ด ์š”์ฒญํ•œ ๋ถ€ํ’ˆ ๋ฒˆํ˜ธ์˜ ์ˆœ์„œ๋Œ€๋กœ ๋ถ€ํ’ˆ์„ ํ™•์ธํ•ด ๋ถ€ํ’ˆ์ด ์žˆ์œผ๋ฉด yes๋ฅผ,

์—†์œผ๋ฉด no๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๊ตฌ๋ถ„์€ ๊ณต๋ฐฑ์œผ๋กœ ํ•œ๋‹ค.

 

์†Œ์Šค์ฝ”๋“œ

 

# ์ด์ง„ ํƒ์ƒ‰ ์†Œ์Šค์ฝ”๋“œ ๊ตฌํ˜„
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 = int(input())
shop_array = list(map(int, input().split()))
shop_array.sort() # ์ด์ง„ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ •๋ ฌํ•˜์ž !

# ์†๋‹˜์ด ์š”์ฒญํ•œ ๋ถ€ํ’ˆ๊ฐœ์ˆ˜, ์š”์ฒญํ•œ ๋ถ€ํ’ˆ ๋ฒˆํ˜ธ
m = int(input())
want_array = list(map(int, input().split()))

# ์†๋‹˜์ด ์š”์ฒญํ•œ ๋ถ€ํ’ˆ ๋ฒˆํ˜ธ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธ 
for i in want_array:
    #ํ•ด๋‹น ๋ถ€ํ’ˆ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ 
    result = binary_search(shop_array, i, 0, n-1)
    if result != None:
        print("yes", end= ' ')
    else:
        print('no', end= ' ')

 

๋ฌธ์ œ 2. ๋–ก๋ณถ์ด ๋–ก ๋งŒ๋“ค๊ธฐ 

 

์ ˆ๋‹จ๊ธฐ์— ๋†’์ด H๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ค„์ง€์–ด์ง„ ๋–ก์„ ํ•œ๋ฒˆ์— ์ ˆ๋‹จํ•ฉ๋‹ˆ๋‹ค. 

๋†’์ด๊ฐ€ H๋ณด๋‹ค ๊ธด ๋–ก์€ H ์œ„์˜ ๋ถ€๋ถ„์ด ์ž˜๋ฆด ๊ฒƒ์ด๊ณ , ๋‚ฎ์€ ๋–ก์€ ์ž˜๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด 19 14 10 17cm ์ธ ๋–ก์ด ๋‚˜๋ž€ํžˆ ์žˆ๊ณ 

์ ˆ๋‹จ๊ธฐ ๋†’์ด๋ฅผ 15cm๋กœ ์ง€์ •ํ•˜๋ฉด ์ž๋ฅธ ๋’ค ๋–ก์˜ ๋†’์ด๋Š” 

15, 14, 10, 15cm ๊ฐ€ ๋  ๊ฒƒ ์ž…๋‹ˆ๋‹ค. 

์ž˜๋ฆฐ ๋–ก์˜ ๊ธธ์ด๋Š” ์ฐจ๋ก€๋Œ€๋กœ 4,0,0,2 cm ์ž…๋‹ˆ๋‹ค. 

์†๋‹˜์€ 6cm ๋งŒํผ์˜ ๊ธธ์ด๋ฅผ ๊ฐ€์ ธ๊ฐ‘๋‹ˆ๋‹ค. 

 

์†๋‹˜์ด ์™”์„ ๋•Œ ์š”์ฒญํ•œ ์ด ๊ธธ์ด๊ฐ€ M์ผ ๋•Œ ์ ์–ด๋„ M๋งŒํผ์˜ ๋–ก์„ ์–ป๊ธฐ ์œ„ํ•ด 

์ ˆ๋‹จ๊ธฐ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ

 

๋ฌธ์ œ ํ•ด๊ฒฐ ์•„์ด๋””์–ด 

=> ์ ์ ˆํ•œ ๋†’์ด๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ์ด์ง„ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋†’์ด๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์กฐ์ •ํ•œ๋‹ค. 

 

ํ˜„์žฌ ์ด ๋†’์ด๋กœ ์ž๋ฅด๋ฉด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€๋ฅผ ํ•™์ธํ•œ ๋’ค์—

์กฐ๊ฑด์˜ ๋งŒ์กฑ ์—ฌ๋ถ€์— ๋”ฐ๋ผ์„œ ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ขํ˜€์„œ ํ•ด๊ฒฐ ! 

์—ฌ๊ธฐ์„œ ์ ˆ๋‹จ๊ธฐ์˜ ๋†’์ด๋Š” 0๋ถ€ํ„ฐ 10์–ต๊นŒ์ง€์˜ ์ •์ˆ˜ ์ค‘ ํ•˜๋‚˜ ?

์ด๋ ‡๊ฒŒ ํฐ ํƒ์ƒ‰๋ฒ”์œ„๋ฅผ ๋ณด๋ฉด ๊ฐ€์žฅ ๋จผ์ € ์ด์ง„ ํƒ์ƒ‰์„ ๋– ์˜ฌ๋ฆฌ์ž ! 

 

์ž…๋ ฅ ์˜ˆ์‹œ :

๋–ก์˜ ๊ฐœ์ˆ˜ 4 ์š”์ฒญํ•œ ๊ธธ์ด 6 

๋–ก์˜ ๊ธธ์ด 19 15 10 17

 

[1๋‹จ๊ณ„] ์‹œ์ž‘์  : 0, ๋์  : 19 , ์ค‘๊ฐ„์ : 9

์ค‘๊ฐ„์ ์œผ๋กœ ์ž๋ฅด๋ฉด, 10, 6, 1, 8 - ๊ฒฐ๊ณผ์ €์žฅ

=> ์กฐ๊ฑด ์ถฉ์กฑ : ์ค‘๊ฐ„์  + 1 ์„ ์‹œ์ž‘์ ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. 

 

[2๋‹จ๊ณ„] ์‹œ์ž‘์  : 10 , ๋์  : 19, ์ค‘๊ฐ„์  : 14

์ค‘๊ฐ„์ ์œผ๋กœ ์ž๋ฅด๋ฉด, 5, 1, 0, 3 - ๊ฒฐ๊ณผ์ €์žฅ

=> ์กฐ๊ฑด ์ถฉ์กฑ : ์ค‘๊ฐ„์  +1 ์„ ์‹œ์ž‘์ ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. 

 

[3๋‹จ๊ณ„] ์‹œ์ž‘์  : 15, ๋์  : 19 , ์ค‘๊ฐ„์  : 17

์ค‘๊ฐ„์ ์œผ๋กœ ์ž๋ฅด๋ฉด, 2,0 ,0 ,0 - ๊ฒฐ๊ณผ ์ €์žฅ ใ„ดใ„ด

=> ์กฐ๊ฑด ์ถฉ์กฑ ๋ชปํ•จ : ๋์ ์„ ์ค‘๊ฐ„์  -1 ๋กœ ์„ค์ •

 

[4๋‹จ๊ณ„] ์‹œ์ž‘์  : 15, ๋์  : 16, ์ค‘๊ฐ„์  : 15 

์ค‘๊ฐ„์ ์œผ๋กœ ์ž๋ฅด๋ฉด, 4,0,0,2 

=> ์กฐ๊ฑด ์ถฉ์กฑ ! ๋”์ด์ƒ ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ ์ค„์–ด๋“ค ์ˆ˜ ์—†์Œ ! 

 

์ค‘๊ฐ„์ ์˜ ๊ฐ’์€ ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ์ตœ์ ํ™”๋œ ๊ฐ’์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์—, 

๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋–ก์˜ ๊ธธ์ด ํ•ฉ์ด 

ํ•„์š”ํ•œ ๋–ก์˜ ๊ธธ์ด๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์„ ๋•Œ๋งˆ๋‹ค ์ค‘๊ฐ„์ ์˜ ๊ฐ’์„ ๊ธฐ๋กํ•˜์ž !

 

# ๋–ก์˜ ๊ฐœ์ˆ˜์™€ ์š”์ฒญํ•œ ๋–ก์˜ ๊ธธ์ด๋ฅผ ์ž…๋ ฅ
n, m = map(int, input().split())
array = list(map(int, input().split()))

# ์‹œ์ž‘์ ๊ณผ ๋์  ์„ค์ •
start = 0
end = max(array)

# ์ด์ง„ ํƒ์ƒ‰ ์ˆ˜ํ–‰ (๋ฐ˜๋ณต์ )
result = 0

while(start <= end):
    total = 0 # ์ด ์ž˜๋ฆฌ๋Š” ๋–ก์˜ ๊ธธ์ด
    mid = (start+end) // 2

    for x in array:
        if x > mid: # ์ ˆ๋‹จ๊ธฐ ๊ธธ์ด๋ณด๋‹ค ๋–ก ๊ธธ์ด๊ฐ€ ๊ธธ๋ฉด ์ ˆ๋‹จ ๊ฐ€๋Šฅ
            total += x - mid # ๋–ก ๊ธธ์ด - ์ ˆ๋‹จ๊ธฐ ๊ธธ์ด // ์ž˜๋ž์„ ๋•Œ ๋–ก์˜ ์–‘ ๊ณ„์‚ฐ
        if total < m:
        # ์š”์ฒญํ•œ ๋–ก ๊ธธ์ด๋ณด๋‹ค ์ž‘์œผ๋ฉด? ๋” ์ž˜๋ผ์•ผ๊ฒ ์ง€ ? ์ ˆ๋‹จ๊ธฐ๋ฅผ ๋” ์•ž์œผ๋กœ, ์ข…๋ฃŒ์ ์„ ์ค‘๊ฐ„์  -1 ๋กœ
            end = mid -1
        else: # ํ•„์š”ํ•œ ๋–ก์˜ ๊ธธ์ด๊ฐ€ ์š”์ฒญํ•œ ๊ธธ์ด๋ณด๋‹ค ํด ๊ฒฝ์šฐ - ์ตœ๋Œ€ํ•œ ๋œ ์ž˜๋ผ์•ผํ•จ ์‹œ์ž‘์ ์„ ์ค‘๊ฐ„์  +1 ๋กœ
            result = mid # ์ตœ๋Œ€ํ•œ ๋œ ์ž˜๋ž์„ ๋–„๊ฐ€ ์ •๋‹ต์ด๋ฏ€๋กœ, ์—ฌ๊ธฐ์„œ ๊ธฐ๋กํ•ด์ฃผ๊ธฐ
            start = mid + 1

print(result)

'Algorithm > CodingTest - Python' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Algorithm) Dynamic Programming ๋ฌธ์ œ  (1) 2022.05.03
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
Comments