본문 바로가기

백준 문제풀이

[Baekjoon 30802] 웰컴 키트 - Java

728x90

[Bronze III] 웰컴 키트 - 30802

문제 링크

성능 요약

메모리: 14364 KB, 시간: 108 ms

분류

사칙연산, 구현, 수학

제출 일자

2025년 2월 19일 10:08:54

문제 설명

2024년 2월 3일 개최 예정인 온사이트 그랜드 아레나에서는 참가자들에게 티셔츠 한 장과 펜 한 자루가 포함된 웰컴 키트를 나눠줄 예정입니다. 키트를 제작하는 업체는 다음과 같은 조건으로만 주문이 가능합니다.

  • 티셔츠는 S, M, L, XL, XXL, 그리고 XXXL의 6가지 사이즈가 있습니다. 티셔츠는 같은 사이즈의 $T$장 묶음으로만 주문할 수 있습니다.
  • 펜은 한 종류로, $P$자루씩 묶음으로 주문하거나 한 자루씩 주문할 수 있습니다.

총 $N$명의 참가자 중 S, M, L, XL, XXL, XXXL 사이즈의 티셔츠를 신청한 사람은 각각 $S, M, L, XL, XXL, XXXL$명입니다. 티셔츠는 남아도 되지만 부족해서는 안 되고 신청한 사이즈대로 나눠주어야 합니다. 펜은 남거나 부족해서는 안 되고 정확히 참가자 수만큼 준비되어야 합니다.

티셔츠를 $T$장씩 최소 몇 묶음 주문해야 하는지, 그리고 펜을 $P$자루씩 최대 몇 묶음 주문할 수 있고, 그 때 펜을 한 자루씩 몇 개 주문하는지 구하세요.

입력

첫 줄에 참가자의 수 $N$이 주어집니다. $(1 \le N \le 10^9)$

둘째 줄에 티셔츠 사이즈별 신청자의 수 $S, M, L, XL, XXL, XXXL$이 공백으로 구분되어 주어집니다. $(0 \le S, M, L, XL, XXL, XXXL \le N;$ $S + M + L + XL + XXL + XXXL = N)$

셋째 줄에 정수 티셔츠와 펜의 묶음 수를 의미하는 정수 $T$와 $P$가 공백으로 구분되어 주어집니다. $(2 \le T, P \le 10^9)$

출력

첫 줄에 티셔츠를 $T$장씩 최소 몇 묶음 주문해야 하는지 출력하세요.

다음 줄에 펜을 $P$자루씩 최대 몇 묶음 주문할 수 있는지와, 그 때 펜을 한 자루씩 몇 개 주문하는지 구하세요.

문제 풀이

간단한 사칙연산과 구현으로 풀었다.

다만, 펜과 관련해서는 문제 내용으로는 이해가 안갔었는데 입력, 출력 부분을 보니 이해할 수 있었다.

입력, 문제를 푸는 부분을 나눠서 구현했다.

티셔츠는 if를 사용해서 묶음으로 나눠떨어지면 그대로 계산했고, 나머지가 있다면 + 1을 추가해줬다.

펜은 그냥 입력받은 P자루를 인원수에 나눠서 몫과 나머지를 출력해주면 된다.

문제 이해하는게 코드를 짜는것보다 오래걸린것 같다..

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

public class Main {
    static int N, T, P, sizeCnt = 6;
    static int[] size = new int[sizeCnt];

    public static void main(String[] args) throws IOException {
        input();
        shirt();
        pen();
    }

    public static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

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

        StringTokenizer st = new StringTokenizer(br.readLine());

        for (int i = 0; i < sizeCnt; i ++) {
            size[i] = Integer.parseInt(st.nextToken());
        }

        st = new StringTokenizer(br.readLine());

        T = Integer.parseInt(st.nextToken());
        P = Integer.parseInt(st.nextToken());
    }

    public static void shirt() {
        int shirtCnt = 0;

        for (int i = 0; i < sizeCnt; i ++) {
            if (size[i] % T == 0) {
                shirtCnt += size[i] / T;
            }
            else {
                shirtCnt += ((size[i] / T) + 1);
            }
        }

        System.out.println(shirtCnt);
    }

    public static void pen() {
        int share = 0, remainder = 0;

        share = N / P;
        remainder = N % P;
        System.out.printf("%d %d", share, remainder);
    }
}

코드 풀이

    static int N, T, P, sizeCnt = 6;
    static int[] size = new int[sizeCnt];
  • 참가자 수를 저장할 N, 티셔츠 묶음을 저장할 T, 펜의 묶음을 저장할 P, 티셔츠 사이즈의 종류를 저장할 sizeCnt 변수를 static으로 선언해 어디서나 사용 가능하게 했다.
  • size는 티셔츠 종류별 신청자 수를 저장할 용도로 배열을 선언했다.
    public static void shirt() {
        int shirtCnt = 0;

        for (int i = 0; i < sizeCnt; i ++) {
            if (size[i] % T == 0) {
                shirtCnt += size[i] / T;
            }
            else {
                shirtCnt += ((size[i] / T) + 1);
            }
        }

        System.out.println(shirtCnt);
    }
  • shirtCnt는 최종적으로 티셔츠를 몇 묶음을 주문해야하는지 저장할 변수로 사용했다.
  • $인원수(N) / 티셔츠 묶음(T) = 몫, 나머지$ 가 나오게 되는데 이를 이용했다.
    • 나머지가 0인 경우 몫 그대로 주문 개수를 추가했다.
    • 나머지가 존재하는 경우 몫 + 1을 하면 티셔츠가 부족하지 않고 남기 때문에 주문 개수에 몫 + 1을 추가했다.
  • 최종적으로 티셔츠 묶음을 출력했다.
    public static void pen() {
        int share = 0, remainder = 0;

        share = N / P;
        remainder = N % P;
        System.out.printf("%d %d", share, remainder);
    }
  • share는 몫을, remainder는 나머지를 저장할 변수로 사용했다.
  • 펜 출력은 인원수에 대한 묶음을 나눠서 나온 몫과 나머지만 출력하면 되기 때문에 그대로 구현했다.
728x90