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