πŸ’»μ½”λ”©ν…ŒμŠ€νŠΈ λ¬Έμ œν’€μ΄7

μ§€λ―Όμ„œΒ·2023λ…„ 3μ›” 13일
0

coding test

λͺ©λ‘ 보기
7/30

Chapter8. 이진 탐색

[문제29] μž…κ΅­μ‹¬μ‚¬ - Level3

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

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

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

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

[μ œν•œμ‚¬ν•­]

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

[λ¬Έμ œν’€μ΄]

  • μž„μ˜λ‘œ 주어진 μ‹œκ°„λ§ŒνΌ λͺ‡ λͺ…을 심사할 수 μžˆμ„μ§€ 계산
    (쀑간에 λ‚¨λŠ” μ‹œκ°„ 없이 κ°€λŠ₯ν•œ λͺ¨λ“  μ‹¬μ‚¬λŒ€λ₯Ό μ‚¬μš©ν–ˆμ„ λ•Œ μ΅œλŒ€ λͺ‡ λͺ…을 심사할 수 μžˆλŠ”μ§€ 확인)

[μ½”λ“œμž‘μ„±]

  • 0λΆ„λΆ€ν„° κ°€μž₯ 였래 κ±Έλ¦¬λŠ” μ†Œμš” μ‹œκ°„μ„ μ‹œμž‘κ³Ό 끝으둜 지정
def solution(n, times):
	answer = 0
    left, right = 1, max(times) * n
  • μ‹œμž‘κ³Ό 끝의 쀑간 μ‹œκ°„μ—μ„œ μ΅œλŒ€ λͺ‡ λͺ… 심사할 수 μžˆμ„μ§€ 계산
while left <= right:
	mid = (left + right) // 2
    people = 0
    test = []
    
    for time in times:
    	people += mid // time
        if people >= n:
        break
  • 심사해야 ν•  μ‚¬λžŒμ˜ μˆ«μžλ³΄λ‹€ 많으면 끝의 크기 쀄이고, 적으면 μ‹œμž‘μ˜ 크기λ₯Ό 쀄여 이진 탐색 μˆ˜ν–‰
if people >= n:
	answer = mid
    right = mid - 1
elif people < n:
	left = mid + 1

[μ „μ²΄μ½”λ“œ]

def solution(n, times):
	answer = 0
    left, right = 1, max(times) * n
    
	while left <= right:
	mid = (left + right) // 2
    print(mid, end=')')
    people = 0
    for time in times:
    	people += mid // time
        if people >= n:	break
        
if people >= n:
	answer = mid
    right = mid - 1
    
elif people < n:
	left = mid + 1
    
return answer
profile
πŸ’» + πŸŽ₯

0개의 λŒ“κΈ€