해당 문제는 여기에서 확인하실 수 있습니다.
def solution(diffs, times, limit):
n = len(diffs)
# 주어진 숙련도(level)로 모든 퍼즐을 풀 수 있는지 확인하는 함수
def check(level):
total_time = 0 # 총 소요 시간
for i in range(n):
diff = diffs[i] # 현재 퍼즐의 난이도
time_cur = times[i] # 현재 퍼즐의 기본 소요 시간
time_prev = 0 # 이전 퍼즐의 소요 시간
if i > 0:
time_prev = times[i-1] # 첫 번째 퍼즐이 아닐 경우에만 이전 퍼즐 시간 적용
if diff <= level:
# 숙련도가 난이도보다 높거나 같으면 퍼즐을 틀리지 않음
total_time += time_cur
else:
# 숙련도가 난이도보다 낮으면 난이도 - 숙련도 만큼 틀림
wrong_attempts = diff - level
# 틀린 횟수 * (현재 퍼즐 시간 + 이전 퍼즐 시간) + 현재 퍼즐 시간
total_time += wrong_attempts * (time_cur + time_prev) + time_cur
# 총 소요 시간이 제한 시간을 초과하면 더 이상 진행할 필요 없음
if total_time > limit:
return False
return True # 모든 퍼즐을 제한 시간 내에 해결 가능
# 이분 탐색을 위한 숙련도 범위 설정
left = 1 # 최소 숙련도는 1
right = max(diffs) + 1 # 최대 난이도보다 1 큰 값 (가능한 최대 숙련도)
answer = right # 정답 초기값 (가장 높은 숙련도로 초기화)
# 이분 탐색 시작
while left < right:
mid = (left + right) // 2 # 중간값 계산 (현재 탐색할 숙련도)
if check(mid):
# mid 숙련도로 모든 퍼즐 해결 가능하면, 더 낮은 숙련도를 찾아봄
answer = mid
right = mid
else:
# mid 숙련도로 모든 퍼즐 해결 불가능하면, 더 높은 숙련도가 필요함
left = mid + 1
return answer # 최소 숙련도 반환