Contents
내가 작성한 코드

내가 작성한 코드
class Solution {
    public int solution(int[] diffs, int[] times, long limit) {
        int left = 1; // 숙련도의 최소값
        int right = 100000; // 숙련도의 최대값
        int answer = right; // 최대 숙련도로 시작
        while (left <= right) {
            int mid = (left + right) / 2; // 숙련도의 중간값
            // 제한시간 내에 문제를 풀 수 있는 경우
            if (canSolve(diffs, times, limit, mid)) {
                answer = mid; // 숙련도를 중간 값으로 변경
                right = mid - 1; // 숙련도 최대값 하락
            } else { // 풀 수 없는 경우
                left = mid + 1; // 숙련도 최소값 증가
            }
        }
        return answer;
    }
    // 좌, 우 값의 중간값을 기준으로 제한시간 내에 문제들을 풀수 있는지 확인하는 메서드
    public boolean canSolve(int[] diffs, int[] times, long limit, int level) {
        long totalTime = times[0]; // 첫 퍼즐은 무조건 틀리지 않음
        for (int i = 1; i < diffs.length; i++) {
            int diff = diffs[i]; // 현재 문제 레벨
            int timeCur = times[i]; // 현재 문제 시간
            int timePrev = times[i - 1]; // 전 문제 시간
            if (diff <= level) { // 숙련도가 문제 레벨보다 높은 경우
                totalTime += timeCur; // 현재 문제 시간만큼 증가
            } else { // 낮은 경우
                int mistake = diff - level; // 실패 횟수
                totalTime += (long) mistake * (timeCur + timePrev) + timeCur; // 시간 계산
            }
            // 제한 시간 이하인지 확인
            if (totalTime > limit)
                return false;
        }
        return true;
    }
}Share article