Algorithm/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€/Python파이썬] 징검닀리 κ±΄λ„ˆκΈ°

meeeeejin 2021. 5. 17. 14:52

문제 링크: https://programmers.co.kr/learn/courses/30/lessons/64062

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - 징검닀리 κ±΄λ„ˆκΈ°

[2, 4, 5, 3, 2, 1, 4, 2, 5, 1] 3 3

programmers.co.kr

 

 

문제 μ„€λͺ…

건널 수 μžˆλŠ” μ‚¬λžŒμ˜ 수λ₯Ό 이진 탐색을 톡해 κ΅¬ν•©λ‹ˆλ‹€. mλͺ…μ˜ μ‚¬λžŒμ— λŒ€ν•΄μ„œ 생각해보면, ν•œ λ²ˆμ— κ±΄λ„ˆμ•Ό ν•˜λŠ” λ””λ”€λŒμ˜ κ°œμˆ˜κ°€ kκ°œλ³΄λ‹€ 크닀면 mλͺ…μ˜ μ‚¬λžŒμ€ 건널 수 μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ m보닀 μž‘μ€ κ°’μœΌλ‘œ λ‹€μŒ 이진 탐색을 μ§„ν–‰ν•©λ‹ˆλ‹€. λ§Œμ•½ ν•œ λ²ˆμ— κ±΄λ„ˆμ•Ό ν•˜λŠ” λ””λ”€λŒμ˜ κ°œμˆ˜κ°€ k개 μ΄ν•˜λΌλ©΄ mλͺ…μ˜ μ‚¬λžŒμ΄ 닀리λ₯Ό 건널 수 μžˆμœΌλ―€λ‘œ m보닀 큰 κ°’μœΌλ‘œ λ‹€μŒ 이진 탐색을 μ§„ν–‰ν•©λ‹ˆλ‹€. 

 

  1. 이진 νƒμƒ‰μ˜ start, endλ₯Ό μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€. 
  2. ν•œ λ²ˆμ— κ±΄λ„ˆμ•Ό ν•˜λŠ” λ””λ”€λŒμ˜ 개수 쀑 μ΅œλŒ“κ°’μ„ κ΅¬ν•©λ‹ˆλ‹€. 
    - λ””λ”€λŒμ— 적힌 μˆ«μžκ°€ κ±΄λ„ˆμ•Ό ν•˜λŠ” μ‚¬λžŒ 수(m) 보닀 μž‘λ‹€λ©΄ λ§ˆμ§€λ§‰ μ‚¬λžŒμ€ ν•΄λ‹Ή λ””λ”€λŒμ„ λ°Ÿμ§€ λͺ»ν•©λ‹ˆλ‹€. 
  3. mλͺ…μ˜ μ‚¬λžŒμ΄ 건널 수 μ—†λŠ” 경우 end = m - 1둜 μ„€μ •ν•©λ‹ˆλ‹€. 
    - ν•œ λ²ˆμ— k개 보닀 더 λ§Žμ€ λ””λ”€λŒμ„ κ±΄λ„ˆμ•Όν•˜λŠ” κ²½μš°μž…λ‹ˆλ‹€. 
  4. mλͺ…μ˜ μ‚¬λžŒμ΄ 건널 수 μžˆλŠ” 경우 start = m + 1둜 μ„€μ •ν•©λ‹ˆλ‹€. 
    - answer = max(answer, m)을 톡해 κ°€λŠ₯ν•œ mλͺ… μ€‘μ—μ„œ μ΅œλŒ“κ°’μ„ κ΅¬ν•©λ‹ˆλ‹€. 
  5. start <= endλ™μ•ˆ 2~4번λ₯Ό λ°˜λ³΅ν•©λ‹ˆλ‹€. 

 

 

 

 

μ†ŒμŠ€μ½”λ“œ

def solution(stones, k):
    answer = 0
    start, end = min(stones), max(stones)
    # 이진 탐색
    while start <= end:
        m = (start + end) // 2
        # ν•œ λ²ˆμ— κ±΄λ„ˆμ•Ό ν•˜λŠ” λ””λ”€λŒμ˜ 개수 쀑 μ΅œλŒ“κ°’
        n, max_jump = 1, 0
        for s in stones:
            if s - m >= 0: 
                max_jump = max(n, max_jump)
                n = 1
            else: # λ””λ”€λŒμ„ λ°Ÿμ§€ λͺ»ν•˜λŠ” 경우
                n += 1
        max_jump = max(n, max_jump)
        
        # mλͺ…μ˜ μ‚¬λžŒμ΄ 건널 수 μ—†λŠ” 경우
        if max_jump > k: 
            end = m - 1
        # mλͺ…μ˜ μ‚¬λžŒμ΄ 건널 수 μžˆλŠ” 경우
        else:
            start = m + 1
            answer = max(answer, m)

    return answer

 

 

 

 

 

728x90