갓생살기프로젝트

[백준/BOJ/C++] 2875번 대회 or 인턴 - Greedy 본문

차근차근 알고리즘/Greedy

[백준/BOJ/C++] 2875번 대회 or 인턴 - Greedy

Heeyeon.dev 2021. 1. 26. 21:14
728x90

 

2875번: 대회 or 인턴

첫째 줄에 N, M, K가 순서대로 주어진다. (0 ≤ M ≤ 100, 0 ≤ N ≤ 100, 0 ≤ K ≤ M+N),

www.acmicpc.net

1. 문제

백준대학교에서는 대회에 나갈 때 2명의 여학생과 1명의 남학생이 팀을 결성해서 나가는 것이 원칙이다. (왜인지는 총장님께 여쭈어보는 것이 좋겠다.)

백준대학교는 뛰어난 인재들이 많아 올해에도 N명의 여학생과 M명의 남학생이 팀원을 찾고 있다. 대회에 참여하려는 학생들 중 K명은 반드시 인턴쉽 프로그램에 참여해야 한다. 인턴쉽에 참여하는 학생은 대회에 참여하지 못한다.

백준대학교에서는 뛰어난 인재들이 많기 때문에, 많은 팀을 만드는 것이 최선이다.

여러분은 여학생의 수 N, 남학생의 수 M, 인턴쉽에 참여해야하는 인원 K가 주어질 때 만들 수 있는 최대의 팀 수를 구하면 된다.


2. 입력

첫째 줄에 N, M, K가 순서대로 주어진다. (0 ≤ M ≤ 100, 0 ≤ N ≤ 100, 0 ≤ K ≤ M+N),


3. 출력

만들 수 있는 팀의 최대 개수을 출력하면 된다.


4. 풀이

먼저 한 팀이 여학생 2명, 남학생 1명으로 구성되기 때문에 특정 조건을 만족할때까지 입력된 여학생,남학생 수에서 각각 2명, 1명씩을 빼면서 팀을 만들어준다. 팀 카운트를 1씩 올려준다.

여기서 조건은 K명의 인원이 인턴쉽에 참여해야하기 때문에 팀은 만들고 남은 학생이 K보다 많아야 한다.

while문으로 표현을 하면 N + M >= K + 3 일 때까지인데, 여기서 3을 더해주는것은 while문을 한번 돌때 각각 2명, 1명이 빠져서 총 3명이 팀으로 빠지기 때문이다. 이 식을 다르게 표현하면 N + M - 3 >= K 로 표현할 수 있겠다.


5. 소스코드

#include <iostream>
using namespace std;
int main(){
    int N; //여학생
    int M; //남학생
    int K; //인턴쉽에 참가해야하는 인원
    
    cin>>N>>M>>K;

    int team = 0; //팀 개수

    while(N >= 2 && M >= 1 && N+M >= K + 3){
        N -= 2;
        M -= 1;
        team++;
    }
    cout<<team;
}#include <iostream>
728x90