[BOJ/Java] 17951: 흩날리는 시험지 속에서 내 평점이 느껴진거야

2025. 5. 16. 17:04·Problem Solving/BOJ
문제

https://www.acmicpc.net/problem/17951

N개의 시험지와 시험지를 나눌 그룹의 수 K가 정수로 주어진다. (1 <= K <= N <= 100,000)

그리고 N개의 시험지에 대한 맞은 문제의 개수가 주어진다.

획득할 수 있는 점수는 맞은 문제 개수의 합이다.

시험지를 K개로 나눈 그룹의 점수 중, 최소가 되는 그룹의 합 중 최댓값을 구해야 한다.

 

풀이

이분 탐색을 사용하여 가능한 최솟값의 범위를 줄여 나간다.

mid 이상 되는 그룹을 몇 개 만들 수 있는지를 세어보고, 그 개수가 k 이상이면 이 mid는 가능한 값으로 간주한다.

mid의 범위는 획득할 수 있는 점수가 된다.

  • 최소로 획득할 수 있는 점수(left)는 시험지 점수 중 가장 작은 값으로 설정해주었다. (그룹 하나의 점수가 0이 될 수 있으므로 0으로 설정해줘도 무방)
  • 최대로 획득할 수 있는 점수(right)는 모든 시험지의 점수를 합한 값이 된다.

 

현재 mid를 기준으로 그룹을 나눴을 때,

  • 그룹의 개수가 k 이상이면, 현재 mid는 최댓값의 후보가 되고, 더 큰 값도 가능한지 확인하기 위해 left = mid + 1
  • 그룹의 개수가 k보다 작으면, mid가 너무 커서 그룹을 많이 만들 수 없으므로 right = mid - 1

 

코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;

    public static void main(String[] args) throws IOException {
        st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());
        int[] scores = new int[n];
        st = new StringTokenizer(br.readLine());
        int left = 0;
        int right = 0;
        for (int i = 0; i < n; i++) {
            int score = Integer.parseInt(st.nextToken());
            scores[i] = score;
            left = Math.min(left, score);
            right += score;
        }

        int answer = 0;
        while (left <= right) {
            int mid = (left + right) / 2;
            
            int group = 0;
            int currentSum = 0;
            for (int i = 0; i < n; i++) {
                currentSum += scores[i];
                if (currentSum >= mid) {
                    group++;
                    currentSum = 0;
                }
            }

            if (group >= k) {
                left = mid + 1;
                answer = mid;
            } else {
                right = mid - 1;
            }
        }

        System.out.println(answer);
    }

}
저작자표시 비영리 동일조건 (새창열림)

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ/Java] 1535: 안녕  (0) 2025.05.18
[BOJ/Java] 16174: 점프왕 쩰리 (Large)  (0) 2025.05.18
[BOJ/Java] 23288: 주사위 굴리기 2  (0) 2025.05.16
[BOJ/Java] 5549: 행성 탐사  (0) 2025.05.15
[BOJ/Java] 18113: 그르다 김가놈  (0) 2025.05.14
'Problem Solving/BOJ' 카테고리의 다른 글
  • [BOJ/Java] 1535: 안녕
  • [BOJ/Java] 16174: 점프왕 쩰리 (Large)
  • [BOJ/Java] 23288: 주사위 굴리기 2
  • [BOJ/Java] 5549: 행성 탐사
friend5hip
friend5hip
개발 관련 지식이나 기록을 남기고 있습니다.
  • friend5hip
    friend5hip
    friend5hip
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • 컴퓨터공학 (2)
        • 자료구조 (0)
        • 알고리즘 (1)
        • 데이터베이스 (1)
      • Problem Solving (42)
        • BOJ (25)
        • 프로그래머스 (15)
      • 언어 (2)
        • JavaScript (2)
      • 라이브러리 (12)
        • React (12)
      • 개발 (2)
      • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    투 포인터
    매개 변수 탐색
    삼성 sw 역량테스트
    vite
    순열
    구간 합
    그리디
    react
    시뮬레이션
    백트래킹
    백준
    문자열
    정렬
    intersection observer
    코드트리
    java
    이분 탐색
    dp
    수학
    구현
    누적 합
    완전 탐색
    맵
    N과 M
    집합
    프로그래머스
    BFS
    JavaScript
    dfs
    소수 판별
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
friend5hip
[BOJ/Java] 17951: 흩날리는 시험지 속에서 내 평점이 느껴진거야
상단으로

티스토리툴바