[Programmers] P64062 징검다리 건너기
[Programmers] P64062 징검다리 건너기
Question
Language: Python
해당 문자를 처음부터 순차적으로 징검다리를 건너는 것을 테스트하면 시간 초과가 발생하게 된다.
최대 반복횟수는 O(NM)이 되는데, 이렇게 하면 20만 * 2억으로 시간복잡도 내에 해결이 불가능하다.
따라서, 위와 같이 반복이 무수히 많은 경우 –> 이분탐색을 고려한다.
어차피, 징검다리에서 중요한 부분은 징검다리의 개수가 아닌, 징검다리 안에 적힌 값이다.
최대 징검다리를 건널 수 있는 최대 사람 수는 1~2억사이다. 그래서 이 사이에서 0인 구간이 k를 넘지 않는 최대값을 구해야한다.
이분 탐색
만약 M에 대해서, 징검다리를 통과할 수 있을 때, 최대값은 M+1 ~ MAX 사이에 존재하게 되고, 징검다리를 통과하지 못하는 경우, 1~ M-1과 같이 범위를 축소 시키면서 최대값을 구하도록 한다.
Solution
def check_stones(stones,m,k):
count=0
for stone in stones:
if stone <= m:
count+=1
#구간의 길이가 k가 넘어서는 순간 이미 징검다리를 통과하지 못하는 것이므로 반복을 종료한다.
if count>=k:
return True
else:
count=0
return False
def solution(stones, k):
answer = 0
start,end=1,200000000
mid=0
while start<=end:
mid=(start+end)//2
#구간의 길이를 K를 넘게 되면 MAX 값을 줄인다.
if check_stones(stones,mid,k):
end=mid-1
else:
start=mid+1
answer=start
return answer
댓글남기기