Problem Solving/[ν•­ν•΄99] TIL

99클럽 μ½”ν…Œ μŠ€ν„°λ”” 3일차 TIL / 이뢄 탐색

geum 2024. 10. 30. 23:47

✏️ 문제

https://school.programmers.co.kr/learn/courses/30/lessons/43238

 

nλͺ…이 μž…ꡭ심사λ₯Ό μœ„ν•΄ μ€„을 μ„œμ„œ κΈ°λ‹€λ¦¬κ³  μžˆμŠ΅λ‹ˆλ‹€. κ° μž…κ΅­μ‹¬μ‚¬λŒ€μ— μžˆλŠ” μ‹¬μ‚¬κ΄€λ§ˆλ‹€ μ‹¬μ‚¬ν•˜λŠ”데 κ±Έλ¦¬λŠ” μ‹œκ°„은 λ‹€λ¦…λ‹ˆλ‹€. 

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

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

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

 

μ œν•œμ‚¬ν•­

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

 

πŸ€– μž…μΆœλ ₯ μ˜ˆμ‹œ

 

🧐 λ‚œμ΄λ„/μ†Œμš” μ‹œκ°„

βœ… λ‚œμ΄λ„: ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ Level 3

βœ… μ†Œμš” μ‹œκ°„: 1μ‹œκ°„ 47λΆ„

βœ… ꢌμž₯ μ‹œκ°„: 1μ‹œκ°„

 

λͺ¨λ“  문제λ₯Ό ꢌμž₯ μ‹œκ°„ μ•ˆμ— μ’€ 풀어보고 μ‹Άλ‹€. λ„ˆλ¬΄ κ²©ν•˜κ²Œ.

 

πŸ’‘ 풀이

1) 문제 μœ ν˜• νŒŒμ•…

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ—μ„œλŠ” 문제 μœ ν˜•μ„ λ°”λ‘œ 보여주기 λ•Œλ¬Έμ— μ˜€λŠ˜μ€ μœ ν˜• νŒŒμ•… μ‹œκ°„μ„ λ”°λ‘œ κ°–μ§€λŠ” μ•Šμ•˜λ‹€.

 

μŠ€ν„°λ”” 1일차/2일차에 ν‘Ό λ¬Έμ œλž‘ μœ ν˜•(μž…λ ₯ λ²”μœ„ 맀우 큼, μ΅œμ†Ÿκ°’ λ˜λŠ” μ΅œλŒ“κ°’ κ΅¬ν•˜κΈ°)이 μ™„μ „νžˆ λ™μΌν•˜λ‹€. 이제 이뢄 νƒμƒ‰μœΌλ‘œ ν’€ 수 μžˆλŠ” μœ ν˜•μ΄ 뭔지 λ³΄μ΄λŠ” 것 κ°™κΈ΄ ν•œλ° κ΅¬ν˜„ν•˜λŠ” 건 아직도 쑰금 μ–΄λ €μ›Œμ„œ 더 많이 풀어봐야겠닀.

 

2) 아이디어 흐름

이전에 ν‘Ό 2개의 λ¬Έμ œμ—μ„œλŠ” 아이디어 흐름을 정리할 λ•Œ κ·Έλƒ₯ 핡심 1, 2둜 ν‘œκΈ°ν–ˆλŠ”λ°, μ±—μ§€ν”Όν‹°μ˜ 도움을 쑰금 λ°›μ•„μ„œ 쒋은 ν‘œν˜„μ„ κ°€μ Έμ™”λ‹€.

 

β‘  β­ν•΅μ‹¬ (1) - λ²”μœ„ 섀정⭐

end λ³€μˆ˜μ˜ μ΄ˆκΈ°κ°’μ— λŒ€ν•΄ κ³ λ―Όν•΄λ³Ό ν•„μš”κ°€ μžˆλ‹€. μ œν•œ μ‚¬ν•­μ—μ„œ 주어진 μ΅œλŒ“κ°’μ„ 써도 상관없을 것 κ°™μ§€λ§Œ μ‘°κΈˆμ΄λ‚˜λ§ˆ 탐색 λ²”μœ„λ₯Ό 쀄이기 μœ„ν•œ 과정이닀.

 

μž…κ΅­μ‹¬μ‚¬κ°€ κ°€μž₯ 였래 κ±Έλ¦¬λŠ” κ²½μš°λŠ” 심사 μ‹œκ°„μ΄ κ°€μž₯ κΈ΄ 심사관이 nλͺ…을 λͺ¨λ‘ μ²˜λ¦¬ν•˜λŠ” 것이닀. λ¬Έμ œμ—μ„œ 주어진 쑰건을 μ΄μš©ν•΄ ν‘œν˜„ν•˜λ©΄ n*max(times)라고 ν•  수 있고 이 κ°’μœΌλ‘œ end λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•΄μ€¬λ‹€.

 

이 κ³Όμ •μ—μ„œ mid κ°’μ˜ μ˜λ―Έλ„ μ •μ˜λ˜λŠ”λ° mid 값은 λͺ¨λ“  μ‚¬λžŒμ΄ 심사λ₯Ό 받을 수 μžˆλŠ” μž„μ˜μ˜ μ‹œκ°„μ„ λœ»ν•œλ‹€.

 

β‘‘ β­ν•΅μ‹¬ (2) - 이뢄 탐색 λŒ€μƒ 섀정⭐

λ‚΄κ°€ 아직 이뢄 탐색 문제λ₯Ό μ–΄λ €μ›Œν•˜λŠ” μ΄μœ λŠ” 이 λΆ€λΆ„ λ•Œλ¬Έμ΄λ‹€. μ•„λž˜λŠ” 1일차/2일차 λ¬Έμ œμ—μ„œ μ‚¬μš©ν•œ 이뢄 탐색 λŒ€μƒμ΄λ‹€.

 

1️⃣ BOJ κ²Œμž„: 승λ₯ (이 λ•Œμ˜ mid 값은 μΆ”κ°€λ‘œ μ§„ν–‰ν•˜λŠ” κ²Œμž„ 횟수λ₯Ό 의미)

2️⃣ BOJ 징검닀리: 점프 거리 λˆ„μ  ν•©(이 λ•Œμ˜ mid 값은 K번째 μ§•κ²€λ‹€λ¦¬μ—μ„œμ˜ 점프 거리λ₯Ό 의미)

 

μ΄λ²ˆμ—” 이 파트 λ‚΄μš©μ΄ μ’€ κΈΈμ–΄μ§ˆ 것 κ°™μ•„μ„œ λ‚΄μš©μ„ μ’€ 더 세뢄화해보겠닀.

 

Step. 1

λ¨Όμ € μ–΄λ–»κ²Œλ“  두 문제 μœ ν˜•μ— λΌμ›Œ λ§žμΆ°μ„œ 탐색 λŒ€μƒμ„ 찾아보렀고 ν–ˆλ‹€. κ²Œμž„ λ¬Έμ œλŠ” 승λ₯ μ„ μ΄μš©ν•΄μ•Ό ν•œλ‹€λŠ” 게 λͺ…ν™•ν•˜κ²Œ λ³΄μ˜€κΈ° λ•Œλ¬Έμ— νŒ¨μŠ€ν•˜κ³  징검닀리 λ¬Έμ œμ—μ„œ μ“΄ λˆ„μ  ν•© κ°œλ…μ„ μ‚¬μš©ν•  수 μžˆμ„ 것 κ°™μ•˜λ‹€.

 

Step. 2

λˆ„μ  합을 μ‚¬μš©ν•˜κΈ°λ‘œ ν–ˆμœΌλ©΄ μ–΄λ–€ 값에 이 κ°œλ…μ„ μ μš©ν• μ§€ ꡬ체화해야 ν•œλ‹€. 사싀 처리 인원 수 말고 λ‹€λ₯Έ 값이 λ– μ˜€λ₯΄μ§€ μ•Šμ•„μ„œ 이 값을 μ‚¬μš©ν–ˆλŠ”λ° 운이 μ’‹κ²Œ λ°©ν–₯이 잘 λ§žμ•˜λ˜ 것 κ°™λ‹€.

 

처리 인원 μˆ˜λŠ” midλ₯Ό times μ•ˆμ— μžˆλŠ” κ°’(time으둜 ν‘œν˜„)으둜 λ‚˜λˆˆ λͺ«μ„ λ”ν•΄μ£Όλ©΄μ„œ λŠ˜λ €κ°€λ©΄ λœλ‹€. midλ₯Ό μ € κ°’μœΌλ‘œ λ‚˜λˆ„λŠ” μ΄μœ λŠ” mid//time이 ν•΄λ‹Ή 심사관이 μ΅œλŒ€λ‘œ μ²˜λ¦¬ν•  수 μžˆλŠ” 인원이기 λ•Œλ¬Έμ΄λ‹€.

 

λˆ„μ  처리 인원이 n보닀 클 경우: μž„μ˜μ˜ μ‹œκ°„ mid μ•ˆμ— λͺ¨λ“  인원을 μ²˜λ¦¬ν•  수 μžˆλ‹€λŠ” λœ»μ΄λ‹€. λ¬Έμ œμ—μ„œ μš”κ΅¬ν•œ 사항은 'μ΅œμ†Ÿκ°’'이기 λ•Œλ¬Έμ— end = mid-1둜 쀄여 κ°€μž₯ μž‘μ€ 값을 μ°Ύμ•„λ‚˜κ°€λ©΄ λœλ‹€.

 

λˆ„μ  처리 인원이 n보닀 μž‘μ„ 경우:  λͺ¨λ“  인원을 μ²˜λ¦¬ν•˜κΈ°μ—λŠ” μ‹œκ°„μ΄ λΆ€μ‘±ν•˜λ‹€λŠ” 의미이기 λ•Œλ¬Έμ— start = mid+1둜 늘렀 값을 μ¦κ°€μ‹œν‚¨λ‹€.

 

3) κ΅¬ν˜„

def solution(n, times):
    answer = float("inf")
    
    times.sort()
    
    start, end = 1, n*max(times)

    while start <= end:
        mid = (start+end)//2
        
        done = 0

        for time in times:
            done += mid//time
        
        if done >= n:
            answer = min(mid, answer)
            
            end = mid-1
        else:
            start = mid+1
        
    return answer

 

4) μ–΄λ €μ› λ˜ 점/배운 μ 

🚨 μ–΄λ €μ› λ˜ 점

  • 점프 거리 λˆ„μ  합이 N보닀 클 λ•Œ, μž‘μ„ λ•Œμ˜ 의미λ₯Ό νŒŒμ•…ν•˜λŠ” 데에 μ‹œκ°„μ΄ 쑰금 κ±Έλ Έλ‹€.

❗ 배운 점

  • 이뢄 탐색 μœ ν˜• 문제λ₯Ό ν’€ λ•ŒλŠ” λ²”μœ„ μ„€μ • → 이뢄 탐색 λŒ€μƒ μ„€μ • → 탐색 쑰건 검사 이 μ„Έ 단계λ₯Ό 기얡해두고 μ‚¬μš©ν•˜λ©΄ μ’‹λ‹€λŠ” 것을 배울 수 μžˆμ—ˆλ‹€.
  • 이 λ¬Έμ œλŠ” μ²˜μŒμ— μ •λ ¬ 없이 μ œμΆœν–ˆλŠ”λ° 톡과가 λμ§€λ§Œ 이뢄 탐색 μœ ν˜•μ„ ν’€κ²Œ 되면 항상 μ •λ ¬ν•˜κ³  μ‹œμž‘ν•˜λŠ” μŠ΅κ΄€μ„ κ°€μ Έμ•Όκ² λ‹€.