[λ°±μ€€] μ˜ˆμ‚°

[λ°±μ€€] μ˜ˆμ‚°_2512

[λ°±μ€€] μ˜ˆμ‚°

μ˜ˆμ‚°

풀이

β€˜μ΄λΆ„νƒμƒ‰β€™ (Binary Search) 기법을 μ΄μš©ν•΄μ„œ μ°Ύμ•„μ•Όν•œλ‹€.
μ²˜μŒμ—” κ·Έλƒ₯ while문으둜 1μ”© μ˜¬λ €κ°€λ©΄μ„œ νƒμƒ‰ν–ˆλŠ”λ°, μ΄λ ‡κ²Œ ν•˜λ©΄ μ•ˆλœλ‹€.

생각해야할 점.
1) μ§€λ°© μ˜ˆμ‚°λ“€μ„ λͺ¨λ‘ ν•©ν–ˆλŠ”λ°, κ΅­κ°€ μ˜ˆμ‚°λ³΄λ‹€ 적은 경우
-> μ „λΆ€ λ‹€ μ˜ˆμ‚°μ„ 쀄 수 μžˆμœΌλ―€λ‘œ λ°°μ—΄μ˜ μ΅œλŒ“κ°’μ΄ μ˜ˆμ‚°μ΄λ‹€.
2) μ§€λ°© μ˜ˆμ‚° 쀑 κ°€μž₯ μ΅œμ†Œμ˜ μ˜ˆμ‚°μœΌλ‘œ ν•©ν–ˆλŠ”λ°, κ΅­κ°€ μ˜ˆμ‚° 보닀 λ§Žμ€ 경우
-> λͺ¨λ‘ ν•©ν–ˆμ„ λ•Œ, κ΅­κ°€ μ˜ˆμ‚°μ— κ°€κΉŒμš΄ μ΅œλŒ“κ°’μœΌλ‘œ λ‚˜μ™€μ•Ό ν•œλ‹€.
3) κ·Έ 쀑간일 경우? -> λͺ¨λ‘ ν•©ν–ˆμ„ λ•Œ, μ€‘κ°„μ΄ν•˜ 값듀은 μ›λž˜ κ°’μœΌλ‘œ 쀑간값 이상은 쀑간값을 μ“΄λ‹€.

생각할 λ•Œ λ§‰νžˆλŠ” λΆ€λΆ„
1) 이뢄 탐색에 λŒ€ν•΄μ„œ 생각을 λͺ»ν–ˆλ‹€.
2) μ΅œλŒ€ μ˜ˆμ‚°μ— κ°€μž₯ κ°€κΉŒμš΄ 값을 μ–΄λ–»κ²Œ μ„ μ •ν•΄μ•Όν•˜λ‚˜ μƒκ°ν–ˆλ‹€.
-> κ°€μž₯ μ΅œλŒ€λ‘œ λ„λ‹¬ν–ˆμ„ λ•Œ, min = midκ°€ λœλ‹€.
3) μ˜ˆμ‚°μ΄ λͺ¨λ‘ 같은 κ²½μš°λŠ” μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒ κ³ λ―Όν–ˆλ‹€. -> μ΅œμ†Œμ˜ μ˜ˆμ‚°μœΌλ‘œλ§Œ μ΄λ£¨μ–΄μ‘ŒκΈ° λ•Œλ¬Έμ— λ”°λ‘œ λΉΌμ•Όν–ˆλ‹€.

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

if sum(data) <= m: # λͺ¨λ‘ ν•©ν–ˆμ„ λ•Œ, μ˜ˆμ‚°λ³΄λ‹€ 적은 경우
    print(max(data))

elif min(data) * n > m: # κ°€μž₯ μ΅œμ†Œμ˜ μ˜ˆμ‚°μœΌλ‘œ μ΄λ£¨μ–΄μ‘Œμ„ λ•Œ, μ˜ˆμ‚°μ΄ 적은 경우
    min, max = 1, min(data)
    result = 0
    while True:
        mid = (min + max) // 2
        
        if mid * n == m or min == mid:
            result = mid
            break
        elif mid * n > m:
            max = mid
        else:
            min = mid
    print(result)

else: # μ΅œμ†Œ μ˜ˆμ‚° 이상 μ΅œλŒ€ μ˜ˆμ‚° μ΄ν•˜λ‘œ λ§Œλ“€ 수 μžˆμ„ λ•Œ, μ˜ˆμ‚°μ΄ λ§Žμ€ 경우
    min, max = data[0], data[-1]
    result = 0
    while True:
        mid = (min + max) // 2
        ans = 0
        for i in data:
            if i <= mid:
                ans += i
            else:
                ans += mid
        
        if ans == m or min == mid:
            result = mid
            break
        elif ans > m:
            max = mid
        else:
            min = mid
    print(result)

νƒœκ·Έ: ,

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ: