[๋ฐฑ์ค€/python] 2805๋ฒˆ : ๋‚˜๋ฌด ์ž๋ฅด๊ธฐ

2021. 3. 11. 23:31

๋ฌธ์ œ

์ƒ๊ทผ์ด๋Š” ๋‚˜๋ฌด M๋ฏธํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทผ์ฒ˜์— ๋‚˜๋ฌด๋ฅผ ๊ตฌ์ž…ํ•  ๊ณณ์ด ๋ชจ๋‘ ๋งํ•ด๋ฒ„๋ ธ๊ธฐ ๋•Œ๋ฌธ์—, ์ •๋ถ€์— ๋ฒŒ๋ชฉ ํ—ˆ๊ฐ€๋ฅผ ์š”์ฒญํ–ˆ๋‹ค. ์ •๋ถ€๋Š” ์ƒ๊ทผ์ด๋„ค ์ง‘ ๊ทผ์ฒ˜์˜ ๋‚˜๋ฌด ํ•œ ์ค„์— ๋Œ€ํ•œ ๋ฒŒ๋ชฉ ํ—ˆ๊ฐ€๋ฅผ ๋‚ด์ฃผ์—ˆ๊ณ , ์ƒ๊ทผ์ด๋Š” ์ƒˆ๋กœ ๊ตฌ์ž…ํ•œ ๋ชฉ์žฌ์ ˆ๋‹จ๊ธฐ๋ฅผ ์ด์šฉํ•ด์„œ ๋‚˜๋ฌด๋ฅผ ๊ตฌํ• ๊ฒƒ์ด๋‹ค.

๋ชฉ์žฌ์ ˆ๋‹จ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค. ๋จผ์ €, ์ƒ๊ทผ์ด๋Š” ์ ˆ๋‹จ๊ธฐ์— ๋†’์ด H๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. ๋†’์ด๋ฅผ ์ง€์ •ํ•˜๋ฉด ํ†ฑ๋‚ ์ด ๋•…์œผ๋กœ๋ถ€ํ„ฐ H๋ฏธํ„ฐ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ„๋‹ค. ๊ทธ ๋‹ค์Œ, ํ•œ ์ค„์— ์—ฐ์†ํ•ด์žˆ๋Š” ๋‚˜๋ฌด๋ฅผ ๋ชจ๋‘ ์ ˆ๋‹จํ•ด๋ฒ„๋ฆฐ๋‹ค. ๋”ฐ๋ผ์„œ, ๋†’์ด๊ฐ€ H๋ณด๋‹ค ํฐ ๋‚˜๋ฌด๋Š” H ์œ„์˜ ๋ถ€๋ถ„์ด ์ž˜๋ฆด ๊ฒƒ์ด๊ณ , ๋‚ฎ์€ ๋‚˜๋ฌด๋Š” ์ž˜๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ ์ค„์— ์—ฐ์†ํ•ด์žˆ๋Š” ๋‚˜๋ฌด์˜ ๋†’์ด๊ฐ€ 20, 15, 10, 17์ด๋ผ๊ณ  ํ•˜์ž. ์ƒ๊ทผ์ด๊ฐ€ ๋†’์ด๋ฅผ 15๋กœ ์ง€์ •ํ–ˆ๋‹ค๋ฉด, ๋‚˜๋ฌด๋ฅผ ์ž๋ฅธ ๋’ค์˜ ๋†’์ด๋Š” 15, 15, 10, 15๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , ์ƒ๊ทผ์ด๋Š” ๊ธธ์ด๊ฐ€ 5์ธ ๋‚˜๋ฌด์™€ 2์ธ ๋‚˜๋ฌด๋ฅผ ๋“ค๊ณ  ์ง‘์— ๊ฐˆ ๊ฒƒ์ด๋‹ค. (์ด 7๋ฏธํ„ฐ๋ฅผ ์ง‘์— ๋“ค๊ณ  ๊ฐ„๋‹ค) ์ ˆ๋‹จ๊ธฐ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด๋Š” ์–‘์˜ ์ •์ˆ˜ ๋˜๋Š” 0์ด๋‹ค.

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

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋‚˜๋ฌด์˜ ์ˆ˜ N๊ณผ ์ƒ๊ทผ์ด๊ฐ€ ์ง‘์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๋ ค๊ณ  ํ•˜๋Š” ๋‚˜๋ฌด์˜ ๊ธธ์ด M์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000)

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

 

์ถœ๋ ฅ

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

 

์ •๋‹ต

import math

N, M = map(int, input().split())    # N = ๋‚˜๋ฌด ๊ฐœ์ˆ˜ / M = ํ•„์š”ํ•œ ๋‚˜๋ฌด ๊ธธ์ด
tree = list(map(int, input().split()))

min = min(tree)
max = max(tree)
sum = sum(tree)

get = (sum - (min * N))  # pivot์„ min์œผ๋กœ ํ–ˆ์„ ๋•Œ ๊ฐ€์ ธ๊ฐˆ ๋‚˜๋ฌด ๊ธธ์ด


def binary(p):
    g = 0
    for t in tree:
        if p < t:
            g += (t - p)
    return g

if get < M:  # ๊ฐ€์ ธ๊ฐˆ ๋‚˜๋ฌด๊ฐ€ ํ•„์š”ํ•œ ๋‚˜๋ฌด๋ณด๋‹ค ์ ์„ ๋•Œ
    print(min - math.ceil((M-get) / N))
elif get == M:  # ๊ฐ€์ ธ๊ฐˆ ๋‚˜๋ฌด๊ฐ€ ํ•„์š”ํ•œ ๋‚˜๋ฌด์™€ ๊ฐ™์„ ๋•Œ
    print(min)

else:  # ๊ฐ€์ ธ๊ฐˆ ๋‚˜๋ฌด๊ฐ€ ํ•„์š”ํ•œ ๋‚˜๋ฌด๋ณด๋‹ค ๋งŽ์„ ๋•Œ
    cut = 0
    while max >= min:
        pivot = (max + min) // 2
        get = binary(pivot)  # ์ด์ง„ํƒ์ƒ‰
        
        if get < M:    # ์ด์ง„ํƒ์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ํ•„์š”ํ•œ ๋‚˜๋ฌด๋ณด๋‹ค ์ ์„ ๋•Œ
            max = pivot - 1
        
        elif get > M:  # ์ด์ง„ํƒ์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ํ•„์š”ํ•œ ๋‚˜๋ฌด๋ณด๋‹ค ๋งŽ์„ ๋•Œ
            cut = pivot
            min = pivot + 1
        
        else:
            cut = pivot
            break
    print(cut)

N๊ฐœ์˜ ๋‚˜๋ฌด ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๋‚˜๋ฌด๋ฅผ min์— ๊ฐ€์žฅ ํฐ ๋‚˜๋ฌด๋ฅผ max์— ๋ชจ๋“  ๋‚˜๋ฌด์˜ ํ•ฉ์„ sum์— ์ €์žฅํ•œ๋‹ค.

๊ฐ€์žฅ ์ž‘์€ ๋‚˜๋ฌด์˜ ๋†’์ด min์„ ๊ธฐ์ค€์œผ๋กœ ์ ˆ๋‹จ๊ธฐ์˜ ๋†’์ด๋ฅผ ์„ค์ •ํ•œ๋‹ค.

min ๋†’์ด๋งŒํผ ๋‚˜๋ฌด๋ฅผ ์ž˜๋ž์„ ๋•Œ, min ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๋‚˜๋ฌด๋Š” ์—†์œผ๋ฏ€๋กœ ๊ฐ€์ ธ๊ฐˆ ๋‚˜๋ฌด์˜ ๊ธธ์ด get ์€ sum - (min*N)์ด ๋œ๋‹ค.

 

if get < M:  # ๊ฐ€์ ธ๊ฐˆ ๋‚˜๋ฌด๊ฐ€ ํ•„์š”ํ•œ ๋‚˜๋ฌด๋ณด๋‹ค ์ ์„ ๋•Œ
    print(min - math.ceil((M-get) / N))
elif get == M:  # ๊ฐ€์ ธ๊ฐˆ ๋‚˜๋ฌด๊ฐ€ ํ•„์š”ํ•œ ๋‚˜๋ฌด์™€ ๊ฐ™์„ ๋•Œ
    print(min)

๊ฐ€์ ธ๊ฐˆ ๋‚˜๋ฌด get์ด ํ•„์š”ํ•œ ๋‚˜๋ฌด M๋ณด๋‹ค ์ ๋‹ค๋ฉด ์ ˆ๋‹จ๊ธฐ์˜ ๋†’์ด๋ฅผ ๋‚ฎ์ถฐ์•ผํ•œ๋‹ค.

์ด๋•Œ ๋ชจ์ž๋ž€ ๋‚˜๋ฌด์˜ ๊ธธ์ด M-get์„ ๋ชจ๋“  ๋‚˜๋ฌด์—์„œ ๊ณตํ‰ํ•˜๊ฒŒ ๊ฐ€์ ธ์™€ ์ฑ„์šฐ๋ฉด ๋˜๋ฏ€๋กœ N์œผ๋กœ ๋‚˜๋ˆˆ ํ›„ ์˜ฌ๋ฆผํ•œ๋‹ค.

๊ทธ ๊ธธ์ด๋งŒํผ ๋ฐ‘์—์„œ ๋‚˜๋ฌด๋ฅผ ์ž˜๋ผ์•ผ ํ•˜๋ฏ€๋กœ ์ ˆ๋‹จ๊ธฐ์˜ ๋†’์ด๋Š” min - math.ceil((M-get) / N)์ด ๋œ๋‹ค.

 

๊ฐ€์ ธ๊ฐˆ ๋‚˜๋ฌด get๊ณผ ํ•„์š”ํ•œ ๋‚˜๋ฌด M์˜ ๊ธธ์ด๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์ •ํ™•ํ•œ ๋†’์ด์—์„œ ์ž˜๋ž๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ 

์ ˆ๋‹จ๊ธฐ์˜ ๋†’์ด์˜€๋˜ min์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

์ด์ œ ๋ฌธ์ œ๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ๋‚˜๋ฌด๋ฅผ ์ž˜๋ž์„ ๋•Œ์ด๋‹ค.

๊ฐ€์ ธ๊ฐˆ ๋‚˜๋ฌด get์ด ํ•„์š”ํ•œ ๋‚˜๋ฌด M๋ณด๋‹ค ๋งŽ๋‹ค๋ฉด ์ ˆ๋‹จ๊ธฐ์˜ ๋†’์ด๋ฅผ ๋†’์—ฌ์•ผํ•œ๋‹ค.

else:  # ๊ฐ€์ ธ๊ฐˆ ๋‚˜๋ฌด๊ฐ€ ํ•„์š”ํ•œ ๋‚˜๋ฌด๋ณด๋‹ค ๋งŽ์„ ๋•Œ
    cut = 0
    while max >= min:
        pivot = (max + min) // 2
        get = binary(pivot)  # ์ด์ง„ํƒ์ƒ‰

์ตœ์†Œ min๋ถ€ํ„ฐ ์ตœ๋Œ€ max์˜ ๋†’์ด๊นŒ์ง€์˜ ๋ฒ”์œ„์—์„œ ์ด์ง„ํƒ์ƒ‰์œผ๋กœ ์ฐพ๋Š”๋‹ค.

pivot์€ ํ•ด๋‹น ๋ฒ”์œ„์˜ ์ค‘๊ฐ„์œผ๋กœ ์„ค์ •ํ•˜๊ณ  get์— ์ด์ง„ํƒ์ƒ‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•œ๋‹ค.

def binary(p):
    g = 0
    for t in tree:
        if p < t:
            g += (t - p)
    return g

binary ํ•จ์ˆ˜์—์„œ๋Š” pivot๊ฐ’์„ ๋ฐ›์•„์˜ฌ p๋ฅผ ๋ชจ๋“  ๋‚˜๋ฌด์˜ ๊ธธ์ด์™€ ๋น„๊ตํ•œ๋‹ค.

๋งŒ์•ฝ p๊ฐ€ ๋‚˜๋ฌด์˜ ๊ธธ์ด t๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ์ ˆ๋‹จ๊ธฐ๋กœ ์ž๋ฅผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ

g์— ์ ˆ๋‹จ๊ธฐ ๋†’์ด p๋งŒํผ ์ž๋ฅธ ๋‚˜๋จธ์ง€ t-p๋ฅผ ๋”ํ•œ๋‹ค.

 

  
        if get < M:    # ์ด์ง„ํƒ์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ํ•„์š”ํ•œ ๋‚˜๋ฌด๋ณด๋‹ค ์ ์„ ๋•Œ
            max = pivot - 1
        
        elif get > M:  # ์ด์ง„ํƒ์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ํ•„์š”ํ•œ ๋‚˜๋ฌด๋ณด๋‹ค ๋งŽ์„ ๋•Œ
            cut = pivot
            min = pivot + 1
        
        else:
            cut = pivot
            break
   

์ด์ œ binary ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐ›์•„์˜จ get๊ณผ ํ•„์š”ํ•œ ๋‚˜๋ฌด์˜ ๊ธธ์ด M์„ ๋น„๊ตํ•œ๋‹ค.

๋งŒ์•ฝ ๊ฒฐ๊ณผ get์ด ํ•„์š”ํ•œ ๋‚˜๋ฌด M๋ณด๋‹ค ์ ๋‹ค๋ฉด ์ ˆ๋‹จ๊ธฐ์˜ ๋†’์ด๋ฅผ ๋‚ฎ์ถฐ์•ผํ•˜๋ฏ€๋กœ ์ตœ๋Œ€๊ฐ’ max๋ฅผ pivot-1๋กœ ์„ค์ •ํ•œ๋‹ค.

๋งŒ์•ฝ ๊ฒฐ๊ณผ get์ด ํ•„์š”ํ•œ ๋‚˜๋ฌด M๋ณด๋‹ค ๋งŽ๋‹ค๋ฉด ์ ˆ๋‹จ๊ธฐ์˜ ๋†’์ด๋ฅผ ๋†’์—ฌ์•ผํ•˜๋ฏ€๋กœ ์ตœ์†Œ๊ฐ’ min์„ pivot+1๋กœ ์„ค์ •ํ•œ๋‹ค.

๐Ÿ’ฅ ์ด๋•Œ get์ด M๋ณด๋‹ค ๋งŽ๋”๋ผ๋„ ํ•ด๋‹น pivot์ด ์ตœ์ ์˜ ๊ฐ’์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋”ฐ๋กœ cut์— pivot ๊ฐ’์„ ์ €์žฅํ•ด๋‘์–ด์•ผ ํ•œ๋‹ค.

๋งŒ์•ฝ ๊ฒฐ๊ณผ get๊ณผ ํ•„์š”ํ•œ ๋‚˜๋ฌด M์ด ๊ฐ™๋‹ค๋ฉด ์ตœ์ ์˜ ๋†’์ด์ด๋ฏ€๋กœ cut์— pivot ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ๋ฐ˜๋ณต๋ฌธ์„ ๋น ์ ธ๋‚˜์˜จ๋‹ค.

 

๋ฐ˜๋ณต๋ฌธ์„ ์‹คํ–‰ํ•˜๋ฉด์„œ max ๊ฐ’์ด min ๊ฐ’๋ณด๋‹ค ์ž‘์•„์ง€๋ฉด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜์˜ ์ด์ง„ํƒ์ƒ‰์„ ๋งˆ์ณค๋‹ค๋Š” ๋œป์ด๋‹ค.

get๊ณผ M์ด ์ผ์น˜ํ•˜๋Š” ์ˆœ๊ฐ„์ด ์—†์—ˆ๋‹ค๋ฉด ๋‘๋ฒˆ์งธ ์กฐ๊ฑด๋ฌธ์—์„œ get์ด M๋ณด๋‹ค ํฐ ์ˆœ๊ฐ„์˜ pivot์ด cut์— ์ €์žฅ๋˜์—ˆ์„ ๊ฒƒ์ด๋‹ค.

cut์— ์ €์žฅ๋œ ๊ฐ’์ด ์ ˆ๋‹จ๊ธฐ์˜ ๋†’์ด์ด๋ฏ€๋กœ ํ•ด๋‹น ๊ฐ’์„ ์ถœ๋ ฅํ•ด์ค€๋‹ค.

 

 

 

์ด์ง„ํƒ์ƒ‰์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ์•„๋ž˜ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค.

2021.03.17 - [๐Ÿ”์•Œ๊ณ ๋ฆฌ์ฆ˜/๐Ÿ”…๊ฐœ๋…์ •๋ฆฌ] - [python] ์ด์ง„ ํƒ์ƒ‰ (Binary Search)

 

[ํŒŒ์ด์ฌ/python] ์ด์ง„ ํƒ์ƒ‰ (Binary Search)

์ด์ง„ ํƒ์ƒ‰์ด๋ž€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ์›ํ•˜๋Š” ์ˆซ์ž๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๋ฐ˜๋“œ์‹œ ์ •๋ ฌ๋œ ์ƒํƒœ์—์„œ ์‹œ์ž‘ํ•ด์•ผํ•˜๊ณ  ๋กœ๊ทธ์‹คํ–‰์‹œ๊ฐ„(O(log N))์„ ๋ณด์žฅํ•œ๋‹ค. target : ์ฐพ์„ ๊ฐ’ start : ์‹œ์ž‘ ์ธ๋ฑ์Šค end

ye333.tistory.com

 

BELATED ARTICLES

more