[Programmers/ level3] μž…κ΅­μ‹¬μ‚¬πŸ””

2 λΆ„ μ†Œμš”


πŸ‘©λ¬Έμ œ

nλͺ…이 μž…κ΅­μ‹¬μ‚¬λ₯Ό μœ„ν•΄ 쀄을 μ„œμ„œ 기닀리고 μžˆμŠ΅λ‹ˆλ‹€. 각 μž…κ΅­μ‹¬μ‚¬λŒ€μ— μžˆλŠ” μ‹¬μ‚¬κ΄€λ§ˆλ‹€ μ‹¬μ‚¬ν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ€ λ‹€λ¦…λ‹ˆλ‹€.

μ²˜μŒμ— λͺ¨λ“  μ‹¬μ‚¬λŒ€λŠ” λΉ„μ–΄μžˆμŠ΅λ‹ˆλ‹€. ν•œ μ‹¬μ‚¬λŒ€μ—μ„œλŠ” λ™μ‹œμ— ν•œ λͺ…λ§Œ 심사λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ°€μž₯ μ•žμ— μ„œ μžˆλŠ” μ‚¬λžŒμ€ λΉ„μ–΄ μžˆλŠ” μ‹¬μ‚¬λŒ€λ‘œ κ°€μ„œ 심사λ₯Ό 받을 수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ 더 빨리 λλ‚˜λŠ” μ‹¬μ‚¬λŒ€κ°€ 있으면 κΈ°λ‹€λ Έλ‹€κ°€ 그곳으둜 κ°€μ„œ 심사λ₯Ό 받을 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  μ‚¬λžŒμ΄ 심사λ₯Ό λ°›λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ„ μ΅œμ†Œλ‘œ ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

μž…κ΅­μ‹¬μ‚¬λ₯Ό κΈ°λ‹€λ¦¬λŠ” μ‚¬λžŒ 수 n, 각 심사관이 ν•œ λͺ…을 μ‹¬μ‚¬ν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ΄ λ‹΄κΈ΄ λ°°μ—΄ timesκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, λͺ¨λ“  μ‚¬λžŒμ΄ 심사λ₯Ό λ°›λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ˜ μ΅œμ†Ÿκ°’μ„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”.


πŸ‘©μ œν•œμ‚¬ν•­

  • μž…κ΅­μ‹¬μ‚¬λ₯Ό κΈ°λ‹€λ¦¬λŠ” μ‚¬λžŒμ€ 1λͺ… 이상 1,000,000,000λͺ… μ΄ν•˜μž…λ‹ˆλ‹€.
  • 각 심사관이 ν•œ λͺ…을 μ‹¬μ‚¬ν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ€ 1λΆ„ 이상 1,000,000,000λΆ„ μ΄ν•˜μž…λ‹ˆλ‹€.
  • 심사관은 1λͺ… 이상 100,000λͺ… μ΄ν•˜μž…λ‹ˆλ‹€.


πŸ‘©μž…μΆœλ ₯ 예

n times return
6 [7, 10] 28

πŸ‘©μž…μΆœλ ₯ 예 μ„€λͺ…

  • κ°€μž₯ 첫 두 μ‚¬λžŒμ€ λ°”λ‘œ 심사λ₯Ό λ°›μœΌλŸ¬ κ°‘λ‹ˆλ‹€.
  • 10뢄이 λ˜μ—ˆμ„ λ•Œ, 두 번째 μ‹¬μ‚¬λŒ€κ°€ λΉ„κ³  4번째 μ‚¬λžŒμ΄ 심사λ₯Ό λ°›μŠ΅λ‹ˆλ‹€.
  • 14뢄이 λ˜μ—ˆμ„ λ•Œ, 첫 번째 μ‹¬μ‚¬λŒ€κ°€ λΉ„κ³  5번째 μ‚¬λžŒμ΄ 심사λ₯Ό λ°›μŠ΅λ‹ˆλ‹€.
  • 20뢄이 λ˜μ—ˆμ„ λ•Œ, 두 번째 μ‹¬μ‚¬λŒ€κ°€ λΉ„μ§€λ§Œ 6번째 μ‚¬λžŒμ΄ κ·Έκ³³μ—μ„œ 심사λ₯Ό 받지 μ•Šκ³  1뢄을 더 κΈ°λ‹€λ¦° 후에 첫 번째 μ‹¬μ‚¬λŒ€μ—μ„œ 심사λ₯Ό λ°›μœΌλ©΄ 28뢄에 λͺ¨λ“  μ‚¬λžŒμ˜ 심사가 λλ‚©λ‹ˆλ‹€.


πŸ™‹β€β™€οΈμ ‘κ·Ό 방법

πŸ””μ΄λΆ„νƒμƒ‰?

  • μ •λ ¬λ˜μ–΄ μžˆλŠ” λ°°μ—΄μ—μ„œ λ²”μœ„λ₯Ό μ ˆλ°˜μ”© 쀄여가면 탐색을 μ§„ν–‰ν•˜λŠ” 방식이닀.
  • μ‹œκ°„ λ³΅μž‘λ„: O(logN)

예: [1, 2, 3, 4, 5, 6, 7, 8]μ—μ„œ 7을 μ°ΎλŠ” 경우

  • μš°μ„  μ΄λΆ„νƒμƒ‰μ—μ„œλŠ” 탐색 λ²”μœ„μ˜ μ‹œμž‘κ³Ό 끝을 λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜λ“€κ³Ό λ²”μœ„μ˜ 쀑간값을 λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜κ°€ ν•„μš”ν•˜λ‹€.

  • 첫 λ‹¨κ³„μ—μ„œ λ²”μœ„μ˜ μ‹œμž‘κ³Ό 끝은 각각 0κ³Ό 8이고, 쀑간값은 4κ°€ λœλ‹€.

  • 찾고자 ν•˜λŠ” 값이 쀑간값보닀 큰 κ°’μ΄λ―€λ‘œ λ²”μœ„λ₯Ό 쀑간값 μ΄ν›„λ‘œ μž¬μ„€μ •ν•΄μ•Ό ν•œλ‹€.
    • λ²”μœ„μ˜ μ‹œμž‘μ΄ 쀑간값 + 1인 5κ°€ λœλ‹€.
    • 찾고자 ν•˜λŠ” κ°’ < 쀑간값: λ²”μœ„μ˜ 끝을 쀑간값-1둜 λ³€κ²½ν•˜μ—¬ λ²”μœ„λ₯Ό μž¬μ„€μ • ν•œλ‹€.
  • 이와 같은 방식을 λ²”μœ„μ˜ μ‹œμž‘κ³Ό 끝이 μ—­μˆœ(μ‹œμž‘ > 끝)이 되기 μ „κΉŒμ§€ λ°˜λ³΅ν•œλ‹€.


πŸ””λ¬Έμ œ ν•΄κ²°

  • ν•΄λ‹Ή 문제의 핡심은 πŸŒŸνŠΉμ • μ‹œκ°„λ™μ•ˆ 심사관듀이 각각 λͺ‡ λͺ…μ˜ μ‚¬λžŒμ„ μ‹¬μ‚¬ν–ˆλŠ”μ§€πŸŒŸμ΄λ‹€.
    • 즉, πŸŒŸπŸŒŸνŠΉμ • μ‹œκ°„μ΄ 주어진닀면 각 심사관듀이 심사할 수 μžˆλŠ” μ‚¬λžŒμ˜ 수λ₯Ό ꡬ할 수 μžˆλ‹€. 이λ₯Ό λ‹€ λ”ν–ˆμ„ λ•Œ nλͺ…이 λ˜λŠ” μ‹œκ°„μ„ κ΅¬ν•˜λ©΄ λ˜λŠ” 것이닀!🌟🌟


  • μ—¬κΈ°μ„œ 이뢄탐색을 μ μš©ν•œλ‹€λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.
    • 탐색할 λŒ€μƒμ€ 심사λ₯Ό λ°›λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ΄ λœλ‹€.
    • 탐색 λ²”μœ„λŠ” 0 ~ 심사λ₯Ό λ°›λŠ”λ° κ±Έλ¦¬λŠ” μ΅œλŒ€ μ‹œκ°„
    • 이뢄탐색을 μ§„ν–‰ν•˜λ©΄μ„œ νŠΉμ • μ‹œκ°„μ— 심사관듀이 심사할 수 μžˆλŠ” 인원 μˆ˜κ°€ n이 λ˜λŠ” μ‹œμ μ„ κ΅¬ν•œλ‹€.

      πŸ”” μ—¬κΈ°μ„œ μ£Όμ˜ν•  점이 μžˆλ‹€.πŸ””

      • νŠΉμ • μ‹œκ°„μ— 각 심사관이 심사할 수 μžˆλŠ” μ‚¬λžŒμ˜ μˆ˜λŠ” λ‹¨μˆœνžˆ λͺ«μ„ ν†΅ν•΄μ„œ νŒŒμ•…ν•˜κΈ° λ•Œλ¬Έμ— n이 λ˜λŠ” μ‹œκ°„λŒ€ μ—¬λŸΏ μ‘΄μž¬ν•  수 μžˆλ‹€λŠ” 점이닀.
      • λ”°λΌμ„œ 이 쀑 μ΅œμ†Ÿκ°’μ„ ꡬ해 문제의 닡을 ꡬ해야 ν•œλ‹€.


πŸ‘© κ·Έλ ‡λ‹€λ©΄ μ½”λ“œλ₯Ό ν†΅ν•΄μ„œ 더 μžμ„Έν•˜κ²Œ μ‚΄νŽ΄λ³΄μž!

def solution(n, times):
    str = 0
    end = n*times[-1]
    mid = end//2
    check = 0
    answer = 0
    
    while str <= end:
        for i in times: #πŸ””ν•΄λ‹Ή μ‹œκ°„λŒ€μ— 심사관듀이 심사할 수 μžˆλŠ” 총 인원
            tmp = mid//i
            check += tmp   
        if check >= n:
            end = mid-1
            if answer == 0:
                answer = mid
            else:
                answer = min(answer, mid) #πŸ””n이 λ˜λŠ” μ‹œκ°„λŒ€ 쀑 μ΅œμ†Ÿκ°’μ„ κ΅¬ν•œλ‹€.
        else:
            str = mid+1
        mid = (str+end)//2
        check = 0
        
    return answer


πŸ‘©β€πŸ’»λ°°μš΄ 점

이번 문제λ₯Ό ν†΅ν•΄μ„œ 잊고 μ§€λƒˆλ˜ 이뢄탐색을 λ‹€μ‹œ ν•œ 번 되짚고 λ„˜μ–΄κ°ˆ 수 μžˆμ—ˆλ‹€.

O(N)의 μ‹œκ°„λ³΅μž‘λ„λ₯Ό κ°€μ§€λŠ” μˆœμ°¨νƒμƒ‰λ³΄λ‹€λŠ” 이뢄탐색(O(logN))을 ν™œμš©ν•˜λŠ” 것이 훨 νš¨μœ¨μ μ΄λΌλŠ” 것을 λ‹€μ‹œ ν•œ 번 λŠλ‚„ 수 μžˆμ—ˆκ³ , 이뢄 νƒμƒ‰μ˜ 경우, μ •λ ¬λœ 배열을 κΈ°μ€€μœΌλ‘œ μ§„ν–‰ν•œλ‹€λŠ” 점도 μ•Œκ²Œ λ˜μ—ˆλ‹€.


πŸ™‡β€β™€οΈν’€μ΄μ— λΆ€μ‘±ν•œ 뢀뢄이 μžˆλ‹€λ©΄ λ§μ”€ν•΄μ£Όμ„Έμš”! κ°μ‚¬ν•©λ‹ˆλ‹€!


πŸ“ƒ μ°Έκ³ 

λŒ“κΈ€λ‚¨κΈ°κΈ°