본문 바로가기

Data Engineering/Python

[코테] 프로그래머스 - 퍼즐 게임 챌린지

import math

def solution(diffs, times, limit):
    def getTime(diffs, times, limit, level):
        time = 0
        for idx, diff in enumerate(diffs):
            if diff <= level:
                time += times[idx]
            else:
                if idx == 0:
                    time += times[0] * (diff - level) + times[0]
                else:
                    time += (times[idx-1] + times[idx]) * (diff - level) + times[idx]
            
            if limit < time:
                time = -1
                break

        return time
    
    level = max(diffs)
    time = getTime(diffs, times, limit, level)
    fail_level = []
    new_level = level

    while time < limit:
        if len(fail_level) == 0:
            new_level = math.ceil(level/2)
        else:
            new_level = math.ceil((level+max(fail_level))/2)

        if level == new_level:
            break

        new_time = getTime(diffs, times, limit, new_level)

        if new_time != -1 and new_time <= limit:
            level = new_level
            time = new_time
        else:
            fail_level.append(new_level)

    return level


# https://school.programmers.co.kr/learn/courses/30/lessons/340212