본문 바로가기

BAEKJOON/수학

백준 15734번 [명장 남정훈](C++) -yes6686- 티스토리

728x90
SMALL

백준 문제 풀이: 15734 [명장 남정훈]


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

문제 설명:

남정훈 명장은 L명의 왼쪽 선수와 R명의 오른쪽 선수, 그리고 추가로 A명의 대기 선수로 팀을 구성하려 합니다. 왼쪽 팀과 오른쪽 팀의 인원이 같아야 하며, 최대한 많은 선수를 사용할 수 있도록 팀을 배치해야 합니다.

최대 구성 가능한 팀의 인원을 출력합니다. 팀을 구성할 때 다음 규칙을 따릅니다:

  • 왼쪽 팀과 오른쪽 팀의 인원이 같아야 합니다.
  • 대기 선수를 적절히 사용하여 양 팀의 인원을 조정할 수 있습니다.
  • 모든 선수를 반드시 사용할 필요는 없습니다.

문제 해결 코드


#include <iostream>
using namespace std;

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

    int L, R, A;
    cin >> L >> R >> A; // 왼쪽 팀, 오른쪽 팀, 대기 선수 수 입력

    while (A > 0) {
        // 대기 선수를 사용하여 양 팀의 균형 맞추기
        if (L < R) {
            L++;
        } else {
            R++;
        }
        A--;
    }

    // 최종적으로 팀 구성 가능 인원의 합 출력
    cout << 2 * min(L, R) << '\n';
    return 0;
}

코드 설명

코드의 주요 로직과 사용된 알고리즘 설명.

  • 핵심 알고리즘:
    • 대기 선수를 양 팀의 인원 차이를 줄이는 데 우선적으로 사용합니다.
    • 남은 대기 선수를 양 팀의 균형이 맞춰진 상태에서 최대한 배분합니다.
    • 최종적으로 균형이 맞춰진 두 팀의 크기를 기준으로 팀 구성 인원의 합을 계산합니다.
  • 구현 세부사항:
    • 양 팀의 크기를 비교하여 대기 선수를 적은 팀에 추가합니다.
    • 대기 선수가 소진된 후, 균형이 맞춰진 두 팀의 크기를 기준으로 결과를 계산합니다.
    • 최대 팀 구성 인원은 2 * min(L, R)로 계산됩니다.
  • 시간 복잡도 분석:
    • 대기 선수 A명에 대해 반복문이 실행되므로 O(A)입니다.
    • A는 최대 1000이므로 효율적입니다.

결과

입력된 선수 수에 따라 최대한 많은 인원을 팀으로 구성하여 출력합니다. 양 팀의 균형을 유지하며 최적의 결과를 계산합니다.

해당 문제에 대한 다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!

728x90
LIST