백준 롤 케이크

KIMYEONGJUN·2025년 3월 29일
0
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개의 댓글

관련 채용 정보