λžœμ„  자λ₯΄κΈ°(κ²°μ •μ•Œκ³ λ¦¬μ¦˜)

πŸ“„ 문제

μ—˜λ¦¬νŠΈ 학원은 자체적으둜 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쀄에 걸쳐 이미 가지고 μžˆλŠ” 각 λžœμ„ μ˜ 길이가 μ„Όν‹°λ―Έν„° λ‹¨μœ„μ˜ 2^31 - 1μ΄ν•˜μ˜ μžμ—°μˆ˜λ‘œ 주어진닀.

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

β–£ μž…λ ₯예제
4 11
802
743
457
539

β–£ 좜λ ₯예제
200

🧞 풀이

더보기

풀이 (μ‹€νŒ¨)

# μ‹€νŒ¨
k, n = map(int, input().split())
k_list = []
c_list = []
c = 0
a_list = []

for i in range(k):
    a = int(input())
    k_list.append(a)

k_list = sorted(k_list, reverse = True)

for i in range(k):
    c += 1
    a = n // k
    if c <= n % k:
        a += 1
    c_list.append(a)

# print(k, n, k_list, c_list)

for j in range(k):
    a_list.append(k_list[j] // c_list[j])

# print(a_list)
print(min(a_list))

 

풀이 (성곡)

k, n = map(int, input().split())
k_list = []
answer = 0

for i in range(k):
    a = int(input())
    k_list.append(a)

lt = 1
rt = max(k_list)

while lt <= rt:
    mid = (lt + rt) // 2
    a = 0
    for i in k_list:
        a += i // mid
    if a >= n:
        if mid >= answer:
            answer = mid
        lt = mid + 1
    else:
        rt = mid - 1

print(answer)

 

λ‹€λ₯Έ μ‚¬λžŒ 풀이

def count(len):
    cnt = 0
    for x in line:
        cnt += (x//len)
    return cnt


k, n = map(int, input().split())
line = []
res = 0 # μ΅œλŒ€κ°’ μ°ΎκΈ°
largest = 0
for i in range(k):
    tmp = int(input())
    line.append(tmp)
    largest = max(largest, tmp)

lt = 1
rt = largest

while lt <= rt:
    mid = (lt + rt) // 2
    if count(mid) >= n:
        res=mid
        lt = mid + 1
    else:
        rt = mid - 1

print(res)

+ Recent posts