Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 코드로 풀어보는 음료 리필 팩 최적 구매 수량 문제

문제 상황

한 주 동안 어느 경기장에서 'a'번의 경기와 'b'번의 기자회견이 개최된다고 가정해 보겠습니다. 경기장에는 선수 탈의실과 기자회견장 두 곳에 각각 카페테리아가 운영되며, 두 카페테리아에는 음료 디스펜서가 하나씩 설치되어 있습니다. 이 디스펜서들은 주가 시작되는 시점에 미리 채워 넣어야 합니다.

탈의실 카페테리아의 디스펜서는 사용 빈도가 높아 매 'c'경기가 끝날 때마다 리필이 필요하고, 기자회견장 카페테리아의 디스펜서는 'd'회의 행사가 진행될 때마다 리필해야 합니다. 경기장 관리위원회는 매주 시작 시점에 총 k개의 음료 리필 팩을 주문할 수 있으며, 그중 x팩은 탈의실용으로, y팩은 기자회견장용으로 배분합니다. 이때 반드시 x + y ≤ k 조건을 만족해야 합니다.

따라서 주어진 일정 정보를 바탕으로 x와 y의 값을 구하고, 필요한 리필 팩의 총합이 k개를 초과한다면 "Limit Exceeded"를 출력하면 됩니다.

예를 들어 입력이 a = 8, b = 8, c = 4, d = 6, k = 9라고 한다면, 출력 결과는 2, 2가 됩니다.

풀이 접근 방법

이 문제의 핵심은 올림 나눗셈(ceiling division)입니다. 전체 경기 수를 리필 주기로 나눈 뒤 올림 처리하면 해당 카페테리아에 필요한 리필 팩 수를 구할 수 있습니다. 정수 연산만으로 올림 나눗셈을 구현하려면 다음 공식을 활용합니다.

a := (c + a - 1) / c
b := (d + b - 1) / d
if a + b <= k, then:
    print(a, b)
Otherwise,
    print("Limit Exceeded")

즉, (분자 + 분모 − 1) ÷ 분모 형태로 계산하면 별도의 실수 연산 없이 정수 나눗셈만으로 올림 효과를 얻을 수 있습니다. 두 카페테리아에 필요한 팩 수의 합이 k 이하이면 각각의 값을 출력하고, 그렇지 않으면 한도 초과 메시지를 출력합니다.

C++ 구현 예제

다음 구현 예제를 통해 동작 과정을 더 자세히 살펴보겠습니다.

#include <bits/stdc++.h>
using namespace std;
#define N 100
void solve(int a, int b, int c, int d, int k) {
    a = (c + a - 1) / c;
    b = (d + b - 1) / d;
    if(a + b <= k)
        cout<<a<<" "<<b<<"\n";
    else
        cout<<"Limit Exceeded."<<"\n";
}
int main() {
    int a = 8, b = 8, c = 4, d = 6, k = 9;
    solve(a, b, c, d, k);
    return 0;
}

입력

8, 8, 4, 6, 9

출력

2 2

결과 해석

경기가 8번 열리고 리필 주기가 4경기이므로 ⌈8 ÷ 4⌉ = 2팩이 필요하고, 기자회견이 8번 열리고 리필 주기가 6회이므로 ⌈8 ÷ 6⌉ = 2팩이 필요합니다. 두 값의 합은 4로 주문 가능한 최대치인 9개를 초과하지 않으므로, 탈의실용 2팩과 기자회견장용 2팩이라는 결과가 출력됩니다.