songining
article thumbnail

μž…κ΅­μ‹¬μ‚¬λ₯Ό λ°›μ•„μ•Ό ν•˜λŠ” nλͺ…μ˜ μ‚¬λžŒμ΄ μžˆμ„ λ•Œ 심사관듀은 심사할 λ•Œ 각각 주어진 times와 같은 μ‹œκ°„μ΄ μ†Œμš”λœλ‹€. 

총 nλͺ…μ˜ μ‚¬λžŒμ΄ μ „λΆ€ 검사λ₯Ό λ°›λŠ”λ° κ±Έλ¦¬λŠ” μ΅œμ†Œμ˜ μ‹œκ°„μ„ κ΅¬ν•˜λŠ” λ¬Έμ œμ˜€λ‹€. 

일단 nλͺ…μ˜ μ‚¬λžŒμ΄ κ²€μ‚¬λ°›λŠ”λ° κ±Έλ¦¬λŠ” μ΅œμ•…μ˜ μ‹œκ°„μ€ κ°€μž₯ 였래 μ‹œκ°„μ΄ μ†Œμš”λ˜λŠ” μ‹¬μ‚¬κ΄€μ—κ²Œ λͺ¨λ“ μ‚¬λžŒμ΄ 검사λ₯Ό λ°›λŠ” κ²½μš°μ΄λ‹€. 

이진 탐색을 μ΄μš©ν•΄ left = 0 right= μ΅œμ•…μ˜ μ‹œκ°„μœΌλ‘œ ν•˜μ—¬ κ°€μž₯ μ΅œμ†Œλ‘œ κ±Έλ¦¬λŠ” μ‹œκ°„μ„ μ°ΎλŠ”λ‹€. 

left = 0
    right = max(time_list) * n  # λͺ¨λ“ μ‚¬λžŒμ΄ λ‹€ 받을 λ•Œ λλ‚˜λŠ” μ‹œκ°„μ˜ μ΅œμ•…μ˜ 경우

    while left <= right:
        mid = (left + right) // 2
        people = 0
        for i in time_list:
            # 각 심사관듀이 mid μ‹œκ°„μ•ˆμ— 검사λ₯Ό 끝낼 수 μžˆλ‚˜
            people += (mid // i)
        # mid μ‹œκ°„μ•ˆμ— μ΅œλŒ€λ‘œ 검사할 수 μžˆλŠ” 인원 = people
        if people >= n:
            answer = mid
            right = mid - 1
        elif people < n:
            left = mid + 1
    print(answer)

λ‚˜λŠ” 이진탐색을 κ΅¬ν˜„ν•˜λ©΄μ„œ 각 심사관듀이 νŠΉμ • μ‹œκ°„μ•ˆμ— 검사λ₯Ό 끝낼 수 μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” 쑰건을 λ§Œλ“œλŠ” 것이 μ’€ μ–΄λ €μ› λ‹€.  일단 time_listλ₯Ό λ„λŠ” for문을 λ§Œλ“€κ³  각각의 μ‹¬μ‚¬μœ„μ›λ“€μ΄ 주어진 μ‹œκ°„μ•ˆμ— μ΅œλŒ€ λͺ‡λͺ…μ˜ μ‚¬λžŒλ“€μ„ 검사할 수 μžˆλŠ”μ§€ κ΅¬ν•˜κ³  κ·Έ λͺ¨λ“  수λ₯Ό people에 λ”ν•œλ‹€.

즉 people보닀 n이 더 크닀면 주어진 μ‹œκ°„(mid)μ•ˆμ— 심사λ₯Ό ν•˜μ§€ λͺ»ν•˜λŠ” 것이고 n이 더 μž‘λ‹€λ©΄ 주어진 μ‹œκ°„μ•ˆμ— 심사가 κ°€λŠ₯ν•œκ²ƒμ΄λ‹€. 

μ΅œμ†Œμ‹œκ°„μ„ ꡬ할 λ•ŒκΉŒμ§€ 이 과정을 λ°˜λ³΅ν•œλ‹€.