🐍 μ½”λ”©ν…ŒμŠ€νŠΈ λŒ€λΉ„ : PS

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] μž…κ΅­μ‹¬μ‚¬ (level3, python)

개발자 HOON 2023. 4. 14. 21:23

 

 

πŸ€” 풀이 μ½”λ“œ

 

def check(n, times, k):
    can_enter = 0
    for t in times:
        can_enter += k // t
    return True if can_enter >= n else False

def solution(n, times):
    answer = 0
    start = 0
    end = min(times) * n
    mid = start
    
    while mid + 1 != end:
        mid = (start + end) // 2
        if check(n, times, mid):
            end = mid
        else:
            start = mid
        
    return end

 

 

πŸ€” 문제 풀이

 

μ΄λΆ„νƒμƒ‰μœΌλ‘œ 풀이해야 ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€. 항상 이뢄 탐색은 μ‹œμž‘μ κ³Ό 끝점을 μž‘λŠ” κΈ°μ€€κ³Ό, μ–΄λ–€ 것을 이뢄탐색에 μ‚¬μš©ν•΄μ•Ό 할지 νŒλ‹¨ν•˜λŠ”κ²Œ μ–΄λ ΅λ„€μš”.

 

이 λ¬Έμ œμ—μ„œ μ΄λΆ„νƒμƒ‰μ˜ λŒ€μƒμ€, λͺ¨λ“  μ‚¬λžŒμ΄ 심사λ₯Ό λ°›λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ„ μ΄λΆ„νƒμƒ‰μ˜ λŒ€μƒμœΌλ‘œ μ‚ΌμŠ΅λ‹ˆλ‹€.

λ‚˜μ˜¬ 수 μžˆλŠ” μ΅œλŒ€ μ‹œκ°„μ€, 검사관 쀑 κ°€μž₯ 짧게 κ±Έλ¦¬λŠ” κ²€μ‚¬κ΄€μ—μ„œ N λͺ…이 λͺ¨λ‘ λ°›λŠ” μΌ€μ΄μŠ€κ°€ 될 수 μžˆκ² λ„€μš”.

 

κ·Έλž˜μ„œ start와 endλ₯Ό 각각 0, min(times) * n으둜 μž‘μ•˜μŠ΅λ‹ˆλ‹€.

이뢄 탐색을 톡해 midλ₯Ό (start + end) // 2둜 μ„€μ •ν•œ ν›„, check ν•¨μˆ˜λ₯Ό 톡해 μ΄λΆ„νƒμƒ‰μ˜ λ²”μœ„μ˜ μ•žμ„ 쀄일지, λ’€λ₯Ό 쀄일지 κ²°μ •ν•©λ‹ˆλ‹€.

check ν•¨μˆ˜λŠ” k μ‹œκ°„λ™μ•ˆ, times의 감독관듀이 각각 μž…κ΅­ 심사λ₯Ό 진행할 수 μžˆλŠ” 양을 λͺ¨λ‘ λ”ν•œ 값을 λ°”νƒ•μœΌλ‘œ, 주어진 nλͺ… 이상을 μ±„μ› λŠ”μ§€ λͺ»μ±„μ› λŠ”μ§€μ— 따라 True와 Falseλ₯Ό κ²°μ •ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

 

λ§Œμ•½ 채웠닀면, mid 값을 μ’€ 더 쀄이기 μœ„ν•΄ endλ₯Ό mid ν¬μ§€μ…˜μœΌλ‘œ λ°”κΏ‰λ‹ˆλ‹€.

nλͺ…을 λ‹€ λͺ» 채웠닀면 μ‹œκ°„μ„ μ’€ 더 늘리기 μœ„ν•΄ startλ₯Ό mid ν¬μ§€μ…˜μœΌλ‘œ λ°”κΏ‰λ‹ˆλ‹€.