본문 바로가기

BAEKJOON/수학

백준 30802번 [웰컴 키트](C++)-yes6686- 티스토리

728x90
SMALL

백준 문제 풀이: 30802 [웰컴 키트]


문제 링크: https://www.acmicpc.net/problem/30802

문제 설명:

n개의 웰컴 키트 재료를 준비하는 데 필요한 최소 작업 수와 작업을 나누는 방법을 계산하는 문제입니다. 작업은 재료를 일정 단위로 나누거나 묶어서 처리하는 방식으로 이루어집니다.

입력:

  • 첫 번째 줄에 준비해야 할 재료의 총 개수 n이 주어집니다. (1 ≤ n ≤ 106)
  • 두 번째 줄에 각 재료의 개수 arr[0] ... arr[5]가 주어집니다. (1 ≤ arr[i] ≤ 106)
  • 세 번째 줄에 작업 단위 t와 작업 묶음 p가 주어집니다. (1 ≤ t, p ≤ 106)

출력:

  • 첫 번째 줄에 필요한 최소 작업 수를 출력합니다.
  • 두 번째 줄에 n개의 재료를 p로 나눈 몫과 나머지를 출력합니다.

문제 해결 코드


#include <iostream>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int n;
    cin >> n;

    int arr[6];
    for (int i = 0; i < 6; i++) {
        cin >> arr[i];
    }

    int t, p;
    cin >> t >> p;

    // 최소 작업 수 계산
    int minTasks = 0;
    for (int i = 0; i < 6; i++) {
        minTasks += (arr[i] + t - 1) / t; // 올림하여 작업 수 계산
    }

    // n을 p로 나눈 몫과 나머지 계산
    int maxGroups = n / p;
    int remainingItems = n % p;

    // 결과 출력
    cout << minTasks << '\n';
    cout << maxGroups << ' ' << remainingItems << '\n';

    return 0;
}

예제

입력:
100
10 20 30 40 50 60
15 25

출력:
30
4 0
입력:
200
50 50 50 50 50 50
10 30

출력:
30
6 20

코드 설명

  • 최소 작업 수 계산:
    • 각 재료를 작업 단위 t로 나눌 때, 남는 재료도 하나의 작업으로 처리합니다.
    • 이를 위해 (arr[i] + t - 1) / t를 사용해 올림 작업을 구현합니다.
  • 나누기 결과:
    • np로 나눈 몫은 최대 작업 그룹 수를 나타냅니다.
    • n % p는 작업 그룹에서 남는 재료 수를 나타냅니다.

시간 복잡도

  • 최소 작업 계산: O(6) (고정된 크기의 배열)
  • 나누기 연산: O(1)
  • 전체 시간 복잡도: O(1)

결과

코드는 재료 준비에 필요한 최소 작업 수와 작업 그룹 분할 결과를 정확히 계산합니다. 입력 크기가 고정되어 있어 효율적으로 동작합니다.

다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!

728x90
LIST