๊ด€๋ฆฌ ๋ฉ”๋‰ด

DOing

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ด์ง„ํƒ์ƒ‰ with Python ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ด์ง„ํƒ์ƒ‰ with Python

mangdo 2021. 5. 22. 23:08

๐Ÿ’ก ์ด์ง„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ๋ฐ˜์œผ๋กœ ์ขํ˜€๊ฐ€๋ฉฐ ๋น ๋ฅด๊ฒŒ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๋‹จ, ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ์–ด์•ผ์ง€๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ˆœ์ฐจํƒ์ƒ‰์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์ด์ง€๋งŒ ์ด์ง„ํƒ์ƒ‰์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(logN)์œผ๋กœ ๋น ๋ฅด๊ฒŒ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋งŒ์•ฝ ๋ฐ์ดํ„ฐ์˜ ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ 2,000๋งŒ์ด ๋„˜์–ด๊ฐ€๋ฉด ์ด์ง„ํƒ์ƒ‰์œผ๋กœ ๋ฌธ์ œ์— ์ ‘๊ทผํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๐Ÿ’ก ์ด์ง„ ํƒ์ƒ‰ ๋™์ž‘๊ณผ์ •

1. ์‹œ์ž‘์ ๊ณผ ๋์  ์‚ฌ์ด์˜ ์ค‘๊ฐ„์ ์„ ์ง€์ •ํ•œ๋‹ค. ์ค‘๊ฐ„์ ์ด ์‹ค์ˆ˜๋ผ๋ฉด ์†Œ์ˆ˜์  ์ดํ•˜๋Š” ๋ฒ„๋ฆฐ๋‹ค.

2. ์ค‘๊ฐ„์ ๊ณผ ์ฐพ์œผ๋ ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ•œ๋‹ค.

3. ์ฐพ์œผ๋ ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘๊ฐ„์ ๋ณด๋‹ค ํฌ๋‹ค๋ฉด ์‹œ์ž‘์ ์„ ์ค‘๊ฐ„์  ์ดํ›„๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

4. ์ฐพ์œผ๋ ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘๊ฐ„์ ๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ๋์ ์„ ์ค‘๊ฐ„์  ์ดํ›„๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

5. ์ฐพ์œผ๋ ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘๊ฐ„์ ๊ณผ ์ผ์น˜ํ• ๋•Œ๊นŒ์ง€ 1~4๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

์ฐพ์œผ๋ ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ 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 # ํƒ์ƒ‰์ด ๋๋‚ฌ์œผ๋‚˜ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค.

 

[ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• ]

๋”๋ณด๊ธฐ
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)

๐Ÿ’ก ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ

 ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋Š” ์ด์ง„ ํƒ์ƒ‰์ด ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณ ์•ˆ๋œ, ํšจ์œจ์ ์ธ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

์šฐ์„  ํŠธ๋ฆฌ๋ž€, Node์™€ Branch๋ฅผ ์ด์šฉํ•ด์„œ, ์‚ฌ์ดํด์„ ์ด๋ฃจ์ง€ ์•Š๋„๋ก ๊ตฌ์„ฑํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์ด์ง„ ํŠธ๋ฆฌ๋ž€, Node์˜ Branch๊ฐ€ 2์ธ ํŠธ๋ฆฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€์ ์ธ ์กฐ๊ฑด์ด ์žˆ๋Š” ์ด์ง„ํŠธ๋ฆฌ์ด๋‹ค.

1) ๋ชจ๋“  ๋…ธ๋“œ๋Š” ์™ผ์ชฝ ๊ฐ€์ง€์— ํฌํ•จ๋˜๋Š” ์–ด๋– ํ•œ ์ˆซ์ž๋ณด๋‹ค๋„ ํฌ๋‹ค.

2) ๋ชจ๋“  ๋…ธ๋“œ๋Š” ์˜ค๋ฅธ์ชฝ ๊ฐ€์ง€์— ํฌํ•จ๋˜๋Š” ์–ด๋– ํ•œ ์ˆซ์ž๋ณด๋‹ค๋„ ์ž‘๋‹ค.

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

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

 ํŒŒ์ด์ฌ์—์„œ๋Š” ์ด์ง„ ํƒ์ƒ‰์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก bisect ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•ด์„œ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ํŠน์ • ๋ฒ”์œ„์— ์†ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ฐฏ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ฑฐ๋‚˜ ํŠน์ • ๊ฐ’์˜ ๋ฐ์ดํ„ฐ ๊ฐฏ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

- bisect_left(a, x) : ๋ฆฌ์ŠคํŠธ a์— ๋ฐ์ดํ„ฐ x๋ฅผ ์‚ฝ์ž…ํ•  ๊ฐ€์žฅ ์™ผ์ชฝ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š” ๋ฉ”์†Œ๋“œ

- bisect_right(a, x) : ๋ฆฌ์ŠคํŠธ a์— ๋ฐ์ดํ„ฐ x๋ฅผ ์‚ฝ์ž…ํ•  ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š” ๋ฉ”์†Œ๋“œ

from bisect import bisect_left, bisect_right

def count_by_range(a, left_value, right_value):
    left_index = bisect_left(a, left_value)
    right_index = bisect_right(a, right_value)
    return right_index - left_index
    
a = [1,2,4,4,5]

# ๊ฐ’์ด 4์ธ ๋ฐ์ดํ„ฐ ๊ฐฏ์ˆ˜
print(count_by_range(a,4,4))
# ๊ฐ’์ด 4~5์ธ ๋ฐ์ดํ„ฐ ๊ฐฏ์ˆ˜
print(count_by_range(a,4,5))

 


๐Ÿ’ก ์ด์ง„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ

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

  ๋™๋นˆ์ด๋„ค ๋–ก๋ณถ์ด ๋–ก์€ ๋–ก๋ณถ์ด ๋–ก์˜ ๊ธธ์ด๊ฐ€ ์ผ์ •ํ•˜์ง€ ์•Š๋‹ค. ๋Œ€์‹ ์— ํ•œ๋ด‰์ง€ ์•ˆ์— ๋“ค์–ด๊ฐ€๋Š” ๋–ก์˜ ์ด๊ธธ์ด๋Š” ์ ˆ๋‹จ๊ธฐ๋กœ ์ž˜๋ผ์„œ ๋งž์ถฐ์ค€๋‹ค. ์ ˆ๋‹จ๊ธฐ์— ๋†’์ด (H)๋ฅผ ์ง€์ •ํ•˜๋ฉด ์ค„์ง€์–ด์ง„ ๋–ก์„ ํ•œ๋ฒˆ์— ์ ˆ๋‹จํ•œ๋‹ค. ๋†’์ด๊ฐ€ H๋ณด๋‹ค ๊ธด ๋–ก์€ H์œ„์˜ ๋ถ€๋ถ„์ด ์ž˜๋ฆด ๊ฒƒ์ด๊ณ  ๋‚ฎ์€ ๋–ก์€ ์ž˜๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

  ์˜ˆ๋ฅผ ๋“ค์–ด ๋†’์ด๊ฐ€ 19, 14, 10, 17cm์ธ ๋–ก์ด ๋‚˜๋ž€ํžˆ ์žˆ๊ณ  ์ ˆ๋‹จ๊ธฐ ๋†’์ด๋ฅผ 15cm๋ผ๊ณ  ํ•˜๋ฉด ์ž๋ฅธ ๋’ค ๋–ก์˜ ๋†’์ด๋Š” 15, 14, 10, 15cm๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ์ž˜๋ฆฐ ๋–ก์˜ ๊ธธ์ด๋Š” ์ฐจ๋ก€๋Œ€๋กœ 4, 0, 0, 2cm์ด๋‹ค. ์†๋‹˜์€ 6cm๋งŒํผ์˜ ๊ธธ์ด๋ฅผ ๊ฐ€์ ธ๊ฐ„๋‹ค.

  ์†๋‹˜์ด ์™”์„ ๋•Œ ์š”์ฒญํ•œ ์ด ๊ธธ์ด๊ฐ€ M์ผ๋•Œ ์ ์–ด๋„ M๋งŒํผ์˜ ๋–ก์„ ์–ป๊ธฐ ์œ„ํ•ด ์ ˆ๋‹จ๊ธฐ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

* ์ž…๋ ฅ ์กฐ๊ฑด

- ์ฒซ์งธ์ค„์— ๋–ก์˜ ๊ฐฏ์ˆ˜ N๊ณผ ์š”์ฒญํ•œ ๋–ก์˜ ๊ธธ์ด M์ด ์ฃผ์–ด์ง„๋‹ค. (1<=N<=1,000,000, 1<=M<=2,000,000,000)

- ๋‘˜์งธ์ค„์—๋Š” ๋–ก์˜ ๊ฐœ๋ณ„ ๋†’์ด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋–ก ๋†’์ด์˜ ์ดํ•ฉ์€ ํ•ญ์ƒ M์ด์ƒ์ด๋ฏ€๋กœ, ์†๋‹˜์€ ํ•„์š”ํ•œ ์–‘๋งŒํผ ๋–ก์„ ์‚ฌ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ๋†’์ด๋Š” 10๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์–‘์˜ ์ •์ˆ˜ ๋˜๋Š” 0์ด๋‹ค.

* ์ถœ๋ ฅ ์กฐ๊ฑด

- ์ ์–ด๋„ M๋งŒํผ์˜ ๋–ก์„ ์ง‘์— ๊ฐ€์ ธ๊ฐ€๊ธฐ ์œ„ํ•ด ์ ˆ๋‹จ๊ธฐ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

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

4 6

19 15 10 17

* ์ถœ๋ ฅ ์˜ˆ์‹œ

15

 

[๋ฌธ์ œ ์•„์ด๋””์–ด]

์ ˆ๋‹จ๊ธฐ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด(H)์˜ ๋ฒ”์œ„๋Š” 1~ ์š”์ฒญํ•œ ๋–ก์˜ ๊ธธ์ด(M)๊นŒ์ง€์ด๋‹ค.

์ด๋•Œ ์š”์ฒญํ•œ ๋–ก์˜ ๊ธธ์ด(M)์˜ ๋ฒ”์œ„๊ฐ€ 20์–ต๊นŒ์ง€์ด๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์ฐจํƒ์ƒ‰์ด์•„๋‹Œ ์ด์ง„ํƒ์ƒ‰์œผ๋กœ ์ ‘๊ทผํ•ด์•ผํ•œ๋‹ค.

 

[์ฝ”๋“œ]

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

start = 0
end = max(rice)
result = 0

# ์ ˆ๋‹จ๊ธฐ ๋†’์ด ์ด์ง„ ํƒ์ƒ‰
# ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋ก ์ตœ์ ํ™”๋œ ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค
while start <= end:
    h = (start+end)//2
    total = 0
    
    # ์ •ํ•œ ์ ˆ๋‹จ๊ธฐ ๋†’์ด ๊ฐ’์œผ๋กœ ์ž˜๋ผ๋ณธ๋‹ค
    for i in range(n):
        # ์ ˆ๋‹จ๊ธฐ ๋†’์ด ๋ณด๋‹ค ๊ธด ๋–ก๋งŒ ์ž๋ฅธ๋‹ค
        if rice[i] > h:
            total += rice[i] - h
        
    # ์†๋‹˜์ด ์›ํ•˜๋Š” ๊ฐ’์— ์ •ํ™•ํžˆ ์ผ์น˜
    if total == m:
        break
    # ์†๋‹˜์ด ์›ํ•˜๋Š” ๋–ก์ด ์ถฉ๋ถ„ํ•˜๋‹ค
    elif total > m:
        # ์ค„ ์ˆ˜๋Š” ์žˆ๋Š” ์ƒํ™ฉ์ด์ง€๋งŒ ๋” ์ ๊ฒŒ ๋‚จ๊ธฐ๋Š” ์ ˆ๋‹จ๊ธฐ ๋†’์ด๋ฅผ ํƒ์ƒ‰
        start = h+1
        result = h # ์ค„ ์ˆ˜๋Š” ์žˆ์œผ๋‹ˆ ์ผ๋‹จ ์ €์žฅํ•ด๋†”์•ผํ•œ๋‹ค
    # ์†๋‹˜์ด ์›ํ•˜๋Š” ๋–ก์ด ๋ถ€์กฑํ•˜๋‹ค
    else :
        end = h-1
        
print(h)

 

 

์ถœ์ฒ˜:

์ด๊ฒƒ์ด ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋‹ค(์ด๋™๋นˆ ์ €)