C++ 코딩테스트 강좌, 칵테일 만들기

본 강좌에서는 C++을 사용하여 칵테일 만들기 문제를 해결하는 방법을 소개합니다. 알고리즘 문제는 일반적으로 특정한 입력에 대해 원하는 출력을 생성하는 과정을 요구합니다. 이번 문제는 다양한 재료를 사용하여 주어진 비율에 맞춰 칵테일을 만드는 문제입니다.

문제 설명

당신은 다양한 재료를 가지고 칵테일을 만들고자 합니다. 각 재료는 특정한 양이 필요합니다. 주어진 비율에 맞추어 각 재료를 사용해 최대한 많은 양의 칵테일을 만들고 싶습니다. 주어진 재료의 양과 필요량을 적절히 계산하여 최대 몇 잔의 칵테일을 만들 수 있는지 구하세요.

입력

  • 첫 번째 줄에 재료의 종류 N (1 ≤ N ≤ 100) 이 주어진다.
  • 두 번째 줄에는 각 재료의 양 A[i] (1 ≤ A[i] ≤ 10^5)가 주어진다.
  • 세 번째 줄에는 각 재료의 필요량 B[i] (1 ≤ B[i] ≤ 10^5)가 주어진다.

출력

최대 만들 수 있는 칵테일의 잔 수를 출력하라.

예제

입력

3
100 200 300
10 20 30

출력

3

문제 해결 접근법

이 문제를 해결하기 위해서는 각 재료의 양과 필요량을 바탕으로 최대 몇 잔의 칵테일을 만들 수 있는지 계산해야 합니다. 이를 위해 아래의 절차를 따릅니다:

  1. 각 재료에 대해 가능한 최대 칵테일 수를 계산합니다. 이는 해당 재료의 양을 필요량으로 나눈 몫입니다.
  2. 모든 재료에 대해 계산한 최대 칵테일 수의 최솟값을 취합니다. 이 값이 최종적으로 만들 수 있는 칵테일의 수가 됩니다.

C++ 코드 구현

이제 위의 접근법을 바탕으로 C++ 코드를 작성해 보겠습니다. 코드는 입력을 받고, 각 재료에 대해 가능한 최대 칵테일 수를 계산하여 최소값을 출력하는 방식입니다.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int N;
    cin >> N; // 재료의 종류
    vector<int> A(N); // 재료 양
    vector<int> B(N); // 재료 필요량

    // 재료의 양 입력
    for (int i = 0; i < N; i++) {
        cin >> A[i];
    }
    
    // 재료의 필요량 입력
    for (int i = 0; i < N; i++) {
        cin >> B[i];
    }

    int maxCocktails = INT_MAX; // 초기값을 매우 큰 값으로 설정

    // 각 재료별 최대 칵테일 수 계산
    for (int i = 0; i < N; i++) {
        int cocktailsPossible = A[i] / B[i]; // 가능한 칵테일 수
        maxCocktails = min(maxCocktails, cocktailsPossible); // 최소값 갱신
    }

    cout << maxCocktails << endl; // 결과 출력
    return 0;
}
    

코드 설명

위 C++ 코드는 다음과 같은 과정을 거쳐 칵테일의 최대 잔 수를 계산합니다:

  1. 재료의 종류 N을 입력받고, 두 개의 벡터 A와 B를 선언하여 재료의 양과 필요량을 저장합니다.
  2. 재료의 양을 입력받고, 각 재료의 필요량을 입력받습니다.
  3. 최대 칵테일 수를 ‘INT_MAX’로 초기화하여 비교할 기준을 정합니다.
  4. 각 재료별로 칵테일을 만들 수 있는 수를 계산하고, 그 중 가장 작은 값을 ‘maxCocktails’에 저장합니다.
  5. 최종적으로 계산된 최대 칵테일 수를 출력합니다.

복잡도 분석

이 문제의 시간 복잡도는 O(N)입니다. N은 재료의 종류 수로, 각각의 재료에 대해 양과 필요량을 검사해야 하므로 선형 시간 복잡도를 가집니다. 공간 복잡도는 O(N)으로, 재료의 양과 필요량을 저장하기 위해 두 개의 벡터를 사용하기 때문입니다.

결론

이번 강좌에서는 C++를 사용하여 칵테일 만들기 문제를 해결하는 방법을 알아보았습니다. 주어진 문제를 해결하기 위해서는 입력을 처리하고, 계산을 통해 원하는 결과를 도출해야 합니다. 이를 통해 알고리즘 문제 해결 능력을 키울 수 있으며, 실제 코딩테스트에서도 유용하게 활용할 수 있습니다.

이 문제를 바탕으로 더 다양한 재료와 조건을 추가하여 문제를 확장해보는 것도 좋은 연습이 될 것입니다. 코드 작성뿐만 아니라, 문제를 이해하고 논리적으로 접근하는 과정이 중요함을 다시 한번 강조하고 싶습니다.