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

 

코딩테스트 연습 - 징검다리 건너기

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

programmers.co.kr

이분탐색을 이용해서 풀이한다. 

정규표현식으로 "0이 연속된 개수" 구하면 시간초과 !

 

이분탐색 코드 (정답)

# 건널 수 없는 경우가 있으면 false -> 이때, mid값을 줄여줘야됨 
# 건널 수 없는 경우가 없으면 true  -> 이때, mid값을 키워줘야됨 
def isPossible(stones, k, mid):
    disappearedStones = 0
    
    for s in stones:
        if s - mid <= 0:
            disappearedStones += 1
            if disappearedStones == k: # disappearedStones이 연속해서 k개가 나오면, False
                return False 
        else:
            disappearedStones = 0
            
    return True
 
    
def solution(stones, k):
    answer = 0
    
    left = 1
    right = 200000000 # stones의 원소값은 1 ~ 200,000,000
    
    while left <= right:
        mid = (left + right) // 2
        print('[left, right, mid]=', left, right, mid)
        
        if isPossible(stones, k, mid):
            print('>[true]')
            left = mid + 1 # mid값을 키워야 되니까, 반갈죽에서 오른쪽 택하겠다 
        else:
            print('>[false]')
            answer = mid # false일때, mid값으로 answer를 업데이트 해나간다.
                         # mid값(=빼야할 숫자)이 결국, 다리를 건넌 사람수와 동일 !
                         # Why? 문제의 조건 : 한명 건널때마다 전체 1씩 감소시키는 조건
            right = mid - 1 # mid값을 줄여야 되니까, 반갈죽에서 왼쪽 택하겠다

    print(answer)
    return answer


solution([2, 4, 5, 3, 2, 1, 4, 2, 5, 1], 3)

(정답 참조 : https://hellominchan.tistory.com/262)