🧩 Algorithm/[BOJ] Silver

BOJ 1654번 : λžœμ„  자λ₯΄κΈ° (Python/Silver 2)

devCloud 2023. 4. 3. 19:58
728x90
 

1654번: λžœμ„  자λ₯΄κΈ°

첫째 μ€„μ—λŠ” μ˜€μ˜μ‹μ΄ 이미 κ°€μ§€κ³  μžˆλŠ” λžœμ„ μ˜ 개수 K, 그리고 ν•„μš”ν•œ λžœμ„ μ˜ 개수 N이 μž…λ ₯λœλ‹€. KλŠ” 1이상 10,000μ΄ν•˜μ˜ μ •μˆ˜μ΄κ³ , N은 1이상 1,000,000μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€. 그리고 항상 K ≦ N 이닀. κ·Έ

www.acmicpc.net

문제

박성원이 μΊ ν”„ λ•Œ μ“Έ N개의 λžœμ„ μ„ λ§Œλ“€μ–΄μ•Ό ν•˜λŠ”λ° λ„ˆλ¬΄ λ°”λΉ μ„œ μ˜μ‹μ΄μ—κ²Œ 도움을 μ²­ν–ˆλ‹€. 이미 μ˜€μ˜μ‹μ€ 자체적으둜 K개의 λžœμ„ μ„ κ°€μ§€κ³  μžˆλ‹€. κ·ΈλŸ¬λ‚˜ K개의 λžœμ„ μ€ 길이가 μ œκ°κ°μ΄λ‹€. 박성원은 λžœμ„ μ„ λͺ¨λ‘ N개의 같은 길이의 λžœμ„ μœΌλ‘œ λ§Œλ“€κ³  μ‹Άμ—ˆκΈ° λ•Œλ¬Έμ— K개의 λžœμ„ μ„ μž˜λΌμ„œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. 예λ₯Ό λ“€μ–΄ 300cm 짜리 λžœμ„ μ—μ„œ 140cm 짜리 λžœμ„ μ„ 두 개 μž˜λΌλ‚΄λ©΄ 20cmλŠ” λ²„λ €μ•Ό ν•œλ‹€. (이미 자λ₯Έ λžœμ„ μ€ 뢙일 수 μ—†λ‹€.)

편의λ₯Ό μœ„ν•΄ λžœμ„ μ„ 자λ₯΄κ±°λ‚˜ λ§Œλ“€ λ•Œ μ†μ‹€λ˜λŠ” κΈΈμ΄λŠ” μ—†λ‹€κ³  κ°€μ •ν•˜λ©°, 기쑴의 K개의 λžœμ„ μœΌλ‘œ N개의 λžœμ„ μ„ λ§Œλ“€ 수 μ—†λŠ” κ²½μš°λŠ” μ—†λ‹€κ³  κ°€μ •ν•˜μž. 그리고 자λ₯Ό λ•ŒλŠ” 항상 μ„Όν‹°λ―Έν„° λ‹¨μœ„λ‘œ μ •μˆ˜κΈΈμ΄λ§ŒνΌ 자λ₯Έλ‹€κ³  κ°€μ •ν•˜μž. Nκ°œλ³΄λ‹€ 많이 λ§Œλ“œλŠ” 것도 N개λ₯Ό λ§Œλ“œλŠ” 것에 ν¬ν•¨λœλ‹€. μ΄λ•Œ λ§Œλ“€ 수 μžˆλŠ” μ΅œλŒ€ λžœμ„ μ˜ 길이λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 μ€„μ—λŠ” μ˜€μ˜μ‹μ΄ 이미 κ°€μ§€κ³  μžˆλŠ” λžœμ„ μ˜ 개수 K, 그리고 ν•„μš”ν•œ λžœμ„ μ˜ 개수 N이 μž…λ ₯λœλ‹€. KλŠ” 1이상 10,000μ΄ν•˜μ˜ μ •μˆ˜μ΄κ³ , N은 1이상 1,000,000μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€. 그리고 항상 K ≦ N 이닀. κ·Έ ν›„ K쀄에 걸쳐 이미 κ°€μ§€κ³  μžˆλŠ” 각 λžœμ„ μ˜ 길이가 μ„Όν‹°λ―Έν„° λ‹¨μœ„μ˜ μ •μˆ˜λ‘œ μž…λ ₯λœλ‹€. λžœμ„ μ˜ κΈΈμ΄λŠ” 231-1보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

 

좜λ ₯

첫째 쀄에 N개λ₯Ό λ§Œλ“€ 수 μžˆλŠ” λžœμ„ μ˜ μ΅œλŒ€ 길이λ₯Ό μ„Όν‹°λ―Έν„° λ‹¨μœ„μ˜ μ •μˆ˜λ‘œ 좜λ ₯ν•œλ‹€.


예제 μž…λ ₯

4 11
802
743
457
539

예제 좜λ ₯

200

풀이

802cm λžœμ„ μ—μ„œ 4개, 743cm λžœμ„ μ—μ„œ 3개, 457cm λžœμ„ μ—μ„œ 2개, 539cm λžœμ„ μ—μ„œ 2개λ₯Ό μž˜λΌλ‚΄ λͺ¨λ‘ 11개λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

 

λ°˜λ‘€

5 10
1
100
100
100
100

answer = 33

 

Solution

import sys
input = sys.stdin.readline

K, N = map(int, input().split())
n = []
for _ in range(K):
    n.append(int(input()))

start = 1
end = max(n)
ans = 0
#자λ₯΄κ³  λ²„λ¦¬λŠ” 게 μ•„λ‹Œ 남은 것도 μ“Έ 수 μžˆλ‹€λŠ” κ±Έ 생각, λ‹€ 자λ₯Ό ν•„μš”λ„ μ—†λ‹€.
while start <= end:
    mid = (start + end) // 2
    res = 0
    for i in n:
        while mid <= i:
            i -= mid
            res += 1
            #자λ₯΄λ‹€κ°€ λ‹΅κ³Ό κ°™μ•„μ§€λŠ” κ²½μš°κ°€ μžˆμœΌλ‹ˆ 자λ₯΄λ©΄μ„œ 확인
            if res == N:
                ans = mid
                break
    if res < N:
        end = mid - 1
    else:
        start = mid + 1
print(ans)
728x90