🧩 Algorithm/[BOJ] Silver

BOJ 2512번 : μ˜ˆμ‚° (Python/Silver 3)

devCloud 2023. 2. 18. 21:56
728x90
 

2512번: μ˜ˆμ‚°

첫째 μ€„μ—λŠ” μ§€λ°©μ˜ 수λ₯Ό μ˜λ―Έν•˜λŠ” μ •μˆ˜ N이 μ£Όμ–΄μ§„λ‹€. N은 3 이상 10,000 μ΄ν•˜μ΄λ‹€. λ‹€μŒ μ€„μ—λŠ” 각 μ§€λ°©μ˜ μ˜ˆμ‚°μš”μ²­μ„ ν‘œν˜„ν•˜λŠ” N개의 μ •μˆ˜κ°€ λΉˆμΉΈμ„ 사이에 두고 μ£Όμ–΄μ§„λ‹€. 이 값듀은 λͺ¨λ‘ 1 이상

www.acmicpc.net

문제

κ΅­κ°€μ˜ μ—­ν•  쀑 ν•˜λ‚˜λŠ” μ—¬λŸ¬ μ§€λ°©μ˜ μ˜ˆμ‚°μš”μ²­μ„ μ‹¬μ‚¬ν•˜μ—¬ κ΅­κ°€μ˜ μ˜ˆμ‚°μ„ λΆ„λ°°ν•˜λŠ” 것이닀. κ΅­κ°€μ˜ˆμ‚°μ˜ 총앑은 미리 μ •ν•΄μ Έ μžˆμ–΄μ„œ λͺ¨λ“  μ˜ˆμ‚°μš”μ²­μ„ λ°°μ •ν•΄ μ£ΌκΈ°λŠ” μ–΄λ €μšΈ μˆ˜λ„ μžˆλ‹€. κ·Έλž˜μ„œ μ •ν•΄μ§„ 총앑 μ΄ν•˜μ—μ„œ κ°€λŠ₯ν•œ ν•œ μ΅œλŒ€μ˜ μ΄ μ˜ˆμ‚°μ„ λ‹€μŒκ³Ό 같은 λ°©λ²•μœΌλ‘œ λ°°μ •ν•œλ‹€.

  1. λͺ¨λ“  μš”μ²­μ΄ 배정될 수 μžˆλŠ” κ²½μš°μ—λŠ” μš”μ²­ν•œ κΈˆμ•‘μ„ κ·ΈλŒ€λ‘œ λ°°μ •ν•œλ‹€.
  2. λͺ¨λ“  μš”μ²­μ΄ 배정될 수 μ—†λŠ” κ²½μš°μ—λŠ” νŠΉμ •ν•œ μ •μˆ˜ μƒν•œμ•‘을 κ³„μ‚°ν•˜μ—¬ κ·Έ 이상인 μ˜ˆμ‚°μš”μ²­μ—λŠ” λͺ¨λ‘ μƒν•œμ•‘μ„ λ°°μ •ν•œλ‹€. μƒν•œμ•‘ μ΄ν•˜μ˜ μ˜ˆμ‚°μš”μ²­μ— λŒ€ν•΄μ„œλŠ” μš”μ²­ν•œ κΈˆμ•‘μ„ κ·ΈλŒ€λ‘œ λ°°μ •ν•œλ‹€. 

예λ₯Ό λ“€μ–΄, 전체 κ΅­κ°€μ˜ˆμ‚°μ΄ 485이고 4개 μ§€λ°©μ˜ μ˜ˆμ‚°μš”μ²­μ΄ 각각 120, 110, 140, 150이라고 ν•˜μž. 이 경우, μƒν•œμ•‘μ„ 127둜 작으면, μœ„μ˜ μš”μ²­λ“€μ— λŒ€ν•΄μ„œ 각각 120, 110, 127, 127을 λ°°μ •ν•˜κ³  κ·Έ 합이 484둜 κ°€λŠ₯ν•œ μ΅œλŒ€κ°€ λœλ‹€. 

μ—¬λŸ¬ μ§€λ°©μ˜ μ˜ˆμ‚°μš”μ²­κ³Ό κ΅­κ°€μ˜ˆμ‚°μ˜ 총앑이 μ£Όμ–΄μ‘Œμ„ λ•Œ, μœ„μ˜ 쑰건을 λͺ¨λ‘ λ§Œμ‘±ν•˜λ„λ‘ μ˜ˆμ‚°μ„ λ°°μ •ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 μ€„μ—λŠ” μ§€λ°©μ˜ 수λ₯Ό μ˜λ―Έν•˜λŠ” μ •μˆ˜ N이 μ£Όμ–΄μ§„λ‹€. N은 3 이상 10,000 μ΄ν•˜μ΄λ‹€. λ‹€μŒ μ€„μ—λŠ” 각 μ§€λ°©μ˜ μ˜ˆμ‚°μš”μ²­μ„ ν‘œν˜„ν•˜λŠ” N개의 μ •μˆ˜κ°€ λΉˆμΉΈμ„ 사이에 두고 μ£Όμ–΄μ§„λ‹€. 이 값듀은 λͺ¨λ‘ 1 이상 100,000 μ΄ν•˜μ΄λ‹€. κ·Έ λ‹€μŒ μ€„μ—λŠ” 총 μ˜ˆμ‚°μ„ λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ M이 μ£Όμ–΄μ§„λ‹€. M은 N 이상 1,000,000,000 μ΄ν•˜μ΄λ‹€. 

 

좜λ ₯

첫째 μ€„μ—λŠ” λ°°μ •λœ μ˜ˆμ‚°λ“€ 쀑 μ΅œλŒ“κ°’μΈ μ •μˆ˜λ₯Ό 좜λ ₯ν•œλ‹€. 


예제 μž…λ ₯

4
120 110 140 150
485

예제 좜λ ₯

127

μ„€λͺ…

λ¬Έμ œλŠ” κΈΈμ§€λ§Œ 사싀상 별 κ±° μ—†λ‹€. μ΄μ˜ˆμ‚°(M)을 λ„˜μ§€ μ•Šλ„λ‘ N개의 지방에 μ μ ˆν•œ μ˜ˆμ‚°μ„ λΆ„λ°°ν•˜λ©΄ λœλ‹€.

풀이

이뢄탐색을 μ΄μš©ν•œλ‹€.

Solution

N = int(input())
n = list(map(int, input().split()))
M = int(input())

s = 0
e = max(n)

#이뢄탐색
while s <= e: 
    r = 0 #ν•©ν•œ κ²°κ³Ό ν™•μΈν•˜κΈ° μœ„ν•œ λ³€μˆ˜
    m = (s + e) // 2 #쀑간

    for i in n:
        if m <= i: #μ˜ˆμ‚° μš”μ²­κ°’λ³΄λ‹€ μƒν•œμ•‘ μ΄ν•˜μΈ 것은 μƒν•œμ•‘ λ°°μ •
            r += m
        else: #μ˜ˆμ‚° μš”μ²­κ°’λ³΄λ‹€ μƒν•œμ•‘ 이상인 것은 μš”μ²­ν•œ κΈˆμ•‘ κ·ΈλŒ€λ‘œ λ°°μ •
            r += i

    if r <= M: #ν•©ν•œ κ²°κ³Όκ°€ 총 μ˜ˆμ‚° μ΄ν•˜μ΄λ©΄
        result = m #μ΅œλŒ€κ°’μ„ μ°ΎκΈ° μœ„ν•΄ 결과에 쀑간값을 κ°±μ‹ 
        s = m + 1 #μƒν•œμ•‘μ„ 더 해도 λ˜λ‹ˆκΉ μ˜ˆμ‚°μ„ 더 늘림
    else:
        e = m - 1

print(result)
728x90