C++ 코딩테스트 강좌, 불우이웃돕기

안녕하세요! 이번 블로그 포스트에서는 C++을 사용한 알고리즘 문제를 풀어보며, 불우이웃 돕기라는 주제로 사회에 기여할 수 있는 방법을 알아보겠습니다. 알고리즘 문제는 우리에게 문제 해결 능력을 기르는 데 중요한 역할을 하며, 실제 취업 면접에서도 자주 등장하는 주제입니다.

문제 설명

많은 사람들이 어려움을 겪고 있는 사회적인 문제에서, 해마다 크리스마스를 맞이하여 자선 기부를 진행합니다. 각 기부자는 자신이 원하는 금액을 기부할 수 있고, 이 기부자들의 기부액을 통해 특정한 수의 불우이웃들을 도울 수 있도록 하려고 합니다. 하지만 각 불우이웃은 기부 받을 수 있는 최대 금액이 정해져 있습니다.

문제 정의

주어진 기부자들의 기부액과 불우이웃이 받을 수 있는 최대 금액의 배열이 있을 때, 모든 불우이웃들이 받을 수 있는 최대 기부 총액을 구하시오.

입력 형식

  • 첫 번째 줄: 기부자의 수 N (1 ≤ N ≤ 1000)
  • 두 번째 줄: 각 기부자의 기부액을 나타내는 N개의 정수 A1, A2, ..., AN (1 ≤ Ai ≤ 10000)
  • 세 번째 줄: 불우이웃의 수 M (1 ≤ M ≤ 1000)
  • 네 번째 줄: 각 불우이웃이 받을 수 있는 최대 금액을 나타내는 M개의 정수 B1, B2, ..., BM (1 ≤ Bj ≤ 10000)

출력 형식

모든 불우이웃들이 받을 수 있는 최대 기부 총액을 출력하시오.

예제 입력

5
1500 2000 3000 4000 5000
3
2000 3000 10000

예제 출력

10000

문제 해결 접근 방법

이 문제를 해결하기 위한 접근 방법은 다음과 같습니다:

  1. 자선 기부자들의 기부액과 각 불우이웃이 받을 수 있는 최대 금액을 정렬합니다.
  2. 각 기부자가 최대로 기부할 수 있는 금액을 한 사람씩 확인하면서 각 불우이웃의 최대 금액을 초과하지 않는 범위 내에서 할당합니다.
  3. 각 기부의 결과를 누적하여 총 기부액을 계산합니다.

C++ 코드 구현

아래는 위의 접근 방법에 대한 C++ 코드입니다:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int N;
    cout << "기부자 수 입력: ";
    cin >> N;

    vector<int> donations(N);
    cout << "기부액 입력: ";
    for (int i = 0; i < N; i++) {
        cin >> donations[i];
    }

    int M;
    cout << "불우이웃 수 입력: ";
    cin >> M;

    vector<int> beneficiaries(M);
    cout << "불우이웃 최대 받을 금액 입력: ";
    for (int i = 0; i < M; i++) {
        cin >> beneficiaries[i];
    }

    // 기부자와 불우이웃의 배열 정렬
    sort(donations.rbegin(), donations.rend());
    sort(beneficiaries.rbegin(), beneficiaries.rend());

    int totalDonated = 0;
    int donationIndex = 0;
    int beneficiaryIndex = 0;

    // 기부자와 불우이웃 매칭
    while (donationIndex < N && beneficiaryIndex < M) {
        if (donations[donationIndex] <= beneficiaries[beneficiaryIndex]) {
            totalDonated += donations[donationIndex];
            donationIndex++;
        } else {
            totalDonated += beneficiaries[beneficiaryIndex];
            beneficiaryIndex++;
        }
    }

    cout << "최대 기부 총액: " << totalDonated << endl;
    return 0;
}

코드 설명

위 코드는 다음과 같은 방식으로 동작합니다:

  1. 기부자 수와 불우이웃 수를 입력받고, 각각의 기부액과 최대 수혜 금액을 입력받습니다.
  2. 각 배열을 내림차순으로 정렬합니다. 이렇게 하면 높은 기부부터 낮은 기부로 비교할 수 있어 최적의 배분이 가능해집니다.
  3. 각 기부자가 최대 금액에 도달하거나 불우이웃의 최대 수혜 금액을 초과하지 않도록 작동하여 가능하면 많은 기부가 이루어지도록 합니다.
  4. 총 기부액을 계산하여 출력합니다.

성과 검증 및 테스트

작성한 코드는 다양한 입력 예제를 통해 검증되어야 합니다. 일반적인 사례 외에도 극단적인 사례(예: 모든 기부자가 동일한 금액 기부 등)도 고려하여 테스트를 진행해야 합니다.

테스트 케이스 예시

입력:
3
3000 3000 3000
4
1500 3000 2000 1000

출력:
9000

위 코드에서 기부자는 3000, 3000, 3000을 기부하고, 불우이웃은 각각 1500, 3000, 2000, 1000을 받을 수 있습니다. 이 경우 가능한 최대 기부 금액은 9000입니다.

마치며

이번 포스트에서는 C++을 사용하여 기부자와 불우이웃을 매칭하는 알고리즘 문제를 통해 논리적인 사고를 기르는 방법을 살펴보았습니다. 코딩테스트에서 자주 사용되는 문제 해결 방법이자 실질적으로 사회적 기여를 할 수 있는 문제를 학습하여 여러분의 프로그래밍 능력을 발전시킬 수 있기를 바랍니다. 코딩 테스트 준비에 많은 도움이 되기를 기원합니다!