백준 롤 케이크

KIMYEONGJUN·2025년 3월 29일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 롤 케이크의 길이 L (1 ≤ L ≤ 1000)이 주어진다.
둘째 줄에는 방청객의 수 N (1 ≤ N ≤ 1000)이 주어진다.
다음 N개 줄에는 각 방청객 i가 종이에 적어낸 수 Pi와 Ki가 주어진다. (1 ≤ Pi ≤ Ki ≤ L, i = 1..N)
 *
첫째 줄에 가장 많은 조각을 받을 것으로 기대하고 있던 방청객의 번호를 출력한다.
둘째 줄에 실제로 가장 많은 조각을 받은 방청객의 번호를 출력한다.
각 경우에 조건을 만족하는 방청객이 두 명 이상이라면 그중 번호가 가장 작은 방청객의 번호를 출력한다.

내가 이 문제를 보고 생각해본 부분

입력 처리: BufferedReader를 사용하여 입력을 받는다.
예상 조각 수 계산: 각 방청객의 요청에 따라 예상 조각 수를 계산한다.
실제 조각 수 계산: 요청한 조각을 순서대로 확인하고, 이미 다른 방청객에게 할당된 조각은 건너뛴다.
최대 조각 수 찾기: 예상과 실제로 받은 조각 수를 비교하여 가장 많은 조각을 받은 방청객의 번호를 결정해준다.
결과 출력: StringBuilder를 사용하여 최종 결과를 한 번에 출력한다.

코드로 구현

package baekjoon.baekjoon_27;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 백준 3985번 문제
public class Main975 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int L = Integer.parseInt(br.readLine());
        int N = Integer.parseInt(br.readLine());

        int[] cake = new int[L + 1];
        int[] expected = new int[N + 1];
        int[] actual = new int[N + 1];

        // 방청객의 요청을 처리
        for(int i = 1; i <= N; i++) {
            String[] input = br.readLine().split(" ");
            int P = Integer.parseInt(input[0]);
            int K = Integer.parseInt(input[1]);

            // 예상 조각 수 계산
            expected[i] = K - P + 1;

            // 실제 조각 수 계산
            for(int j = P; j <= K; j++) {
                if(cake[j] == 0) { // 조각이 비어있다면
                    cake[j] = i; // 이 조각을 i번째 방청객에게 할당
                    actual[i]++;
                }
            }
        }

        // 가장 많은 조각을 받을 것으로 기대한 방청객의 번호 찾기
        int maxExpected = 0;
        int expectedWinner = 0;
        for(int i = 1; i <= N; i++) {
            if(expected[i] > maxExpected) {
                maxExpected = expected[i];
                expectedWinner = i;
            } else if (expected[i] == maxExpected && i < expectedWinner) {
                expectedWinner = i;
            }
        }

        // 실제로 가장 많은 조각을 받은 방청객의 번호 찾기
        int maxActual = 0;
        int actualWinner = 0;
        for(int i = 1; i <= N; i++) {
            if(actual[i] > maxActual) {
                maxActual = actual[i];
                actualWinner = i;
            } else if(actual[i] == maxActual && i < actualWinner) {
                actualWinner = i;
            }
        }

        // 결과 출력
        sb.append(expectedWinner).append("\n").append(actualWinner).append("\n");
        System.out.print(sb.toString());
        br.close();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글