https://programmers.co.kr/learn/courses/30/lessons/64062
문제
제한사항
- 접근 방법
- stones 배열 원소 최대값이 200,000,000로 매우 크므로, 시간복잡도를 고려해야함. 이분 탐색 방법을 사용
- left에 초기 최소값(답이 될수 있는) 1로 초기화, right에 최대값을 max(stones)로 초기화한다.
- mid 값으로 징검다리를 건널 수 있는 지 확인한다.
1.건널 수 있으면 mid값을 우선 answer에 저장 후, left 값을 mid+1로 이동시킨다.
2.건널수 없으면 right 값을 mid-1 로 이동시킨다.- 건널 수 있는 최대 명수를 구해야 하므로, left <= right 인 동안 반복한다.
def solution(stones, k):
answer = 1
left,right = 1, max(stones)
while left <= right:
mid = (left + right) // 2
temp = [x-mid for x in stones]
cnt = 0
for stone in temp:
if stone < 0:
cnt += 1
if cnt == k :
right = mid - 1
break
else:
cnt = 0
else:
answer = max(answer, mid)
left = mid + 1
return answer
처음부터 끝까지 flow를 정확히 이해하지 않으면, 숫자가 꼬일수 있다. for-else문 보다 코드 가독성을 위해 따로 판정 함수를 만드는 방법이 낫겠다.
def isPossible(n, stones, k):
blank = 0
for stone in stones:
if stone < n :
blank += 1
if blank == k :
return False
else:
blank = 0
return True
def solution(stones, k):
answer = 1
left, right = 1, max(stones)
while left <= right :
mid = (left + right) // 2
if isPossible(mid, stones, k) :
answer = mid
left = mid + 1
else :
right = mid - 1
return answer
두번째 방법으로 가독성 뿐 아니라 시간과 메모리효율도 더 좋아졌다.