곰퓨타의 SW 이야기

[프로그래머스 level3 징검다리 건너기] 이분탐색 활용하기 본문

TIL/프로그래머스

[프로그래머스 level3 징검다리 건너기] 이분탐색 활용하기

곰퓨타 2021. 9. 23. 00:07

해결해야하는 문제는 다음과 같았다.

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

 

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

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

programmers.co.kr

 

정확성만을 고려한 아이디어는 다음과 같다.

정확성만을 고려하여,, 해결한 코드는 다음과 같다.

def solution(stones, k):
    person = 0
    while True :
        temp = 0
        for i in range(len(stones)):
            if stones[i]==0 :
                temp += 1
                if temp >= k:
                    return person
            else :
                stones[i]-=1
                temp = 0
        person += 1

    return answer

 

 

 

하지만 이는 효율성 테스트를 통과하지 못한다!

효율성 테스트를 위해, 질문하기를 보며 힌트를 얻은 결과 이분탐색을 활용하라는 힌트를 얻을 수 있었다.

따라서 사람 수를 기준으로 이분탐색을 시작하도록 하였다.

 

 

이러한 아이디어를 통해 작성한 코드는 다음과 같다.

def possible(n,stones,k):
    stones = list(stones)
    if max(stones) < n:
        return False
    temp = 0
    for i in range(len(stones)):
        stones[i] -= n
        if stones[i]<0 :
            temp += 1
            if temp>=k :
                return False
        else :
            temp = 0
    return True

def solution(stones,k):
    left = 0
    right = 200000001
    mid = (left+right)//2
    max_stone = max(stones)
    while left< right :
        mid = (left+right)//2
        if left == mid or right==mid:
            break
        if possible(mid,stones,k) :
            left = mid
        else :
            right = mid
    return mid

 

다행히 효율성테스트도 통과할 수 있었다 !

효율성 테스트를 통과하지 못하는 경우, 해시 테이블 사용 , 2차원행렬->1차원의 긴 배열로 생각, 이분탐색 등의 방법들을 생각해보고 문제에 맞게 풀어내는게 중요할 것 같다!! 

Comments