Algorithm/Beakjoon
[JAVA] 백준 17951번 : 흩날리는 시험지 속에서 내 평점이 느껴진거야
mopipi
2024. 5. 18. 21:27
반응형
https://www.acmicpc.net/problem/17951
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int[] score = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
int maxScore = 0;
int left = 0, right = Arrays.stream(score).sum();
while(left <= right) {
int mid = (left + right) / 2;
int gCnt = 0, sum = 0;
for(int s : score) {
sum += s;
if(sum >= mid) {
gCnt++;
sum = 0;
}
}
if(gCnt >= K) {
left = mid+1;
maxScore = mid;
}
else
right = mid-1;
}
System.out.println(maxScore);
}
}
💡 이분 탐색
풀이
- 시험지 순서 그대로 K개의 그룹으로 나눈 뒤, 각 그룹의 점수 합을 구하고 -> 그 중 최솟값을 기록
- 그렇기에 임의의 기준 점수(점수로 처리될 최솟값)을 먼저 결정하고, 반대로 그 기준 점수에 맞춰 그룹을 어떻게 나눌지 결정
- 즉, left( 0 ) ~ right(시험지 점수 총합)으로 진행하며 그룹이 총 몇개 나오는지에 따라 left, right 값을 조정해가며 기준 점수를 조정 해나간다.
- 기준 점수(mid)가 정해지면, 앞에서부터 점수를 누적합 한 (순서 그대로므로) 뒤 기준을 넘기면 카운팅을 해준다.
- 카운팅한 그룹 수가 K보다 많으면 기준이 너무 낮다는 것 -> left를 올린다 (같아도 이렇게, 최대 점수 구해야 하므로)
- 이때 answer도 갱신해준다
- 카운팅한 그룹 수가 K보다 적으면 기준이 너무 높다는 것 -> right를 내린다
반응형