코테/Divide&conquer
[java] [PCCP 기출문제] 2번 / 퍼즐 게임 챌린지
상똥
2024. 9. 16. 19:15
풀이 |
1. level의 최댓값과 최솟값을 설정한다 - max_level = Array.stream(diffs).max().getAsInt(); - min_level = 1; 2. 퍼즐을 풀이하며 누적된 시간을 cum_time에 저장한다. 초기값은 0 3.이진탐색을 사용해 범위를 반씩 좁혀가며 해결한다 - binarySearch(난이도, 소요시간, 레벨) - cum_time > limit 이면 min_level을 중위값으로 높인다 - cum_time < limit 이면 max_level을 중위값으로 내린다 |
회고 |
result의 범위가 너무 넓은 경우에는 이진탐색을 해야 엄청난 양의 계산을 피할 수 있다 |
코드 (접은 글) |
더보기
import java.util.*;
class Solution {
public int solution(int[] diffs, int[] times, long limit) {
int max_level = Arrays.stream(diffs).max().getAsInt();
int min_level = 1;
long cum_time = 0;
while(min_level < max_level) {
int level = (min_level + max_level) / 2;
cum_time = calc_time(diffs, times, level);
if (cum_time <= limit) max_level = level;
else min_level = level + 1;
}
return max_level;
}
private long calc_time(int[] diffs, int[] times, int level) {
long time = 0;
for(int i=0; i<diffs.length; i++) {
if(diffs[i] <= level) {
time += times[i];
} else {
int time_prev = i == 0 ? 0 : times[i-1];
int time_cur = times[i];
time += (time_prev + time_cur) * (diffs[i] - level) + time_cur;
}
}
return time;
}
}