알고리즘/백준

백준-2875번/대회 or 인턴 (java)

연향동큰손 2024. 10. 3. 23:29

문제

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

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

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

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

입력

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

출력

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

 

 

문제 이해

 

브론즈 3 문제 이지만 반례 때문에 애를 좀 먹었다.

 

다양한 풀이가 있지만 나는 이러한 방식으로 문제를 해결했다.

 

ex)

6 10 3

 

1) 남학생 + 여학생 = 16

2) 대회에 나갈 수 있는 학생의 수 16-3 = 13

3) 대회에 나갈 수 있는 학생수로 만들 수 있는 총 팀 수 = 13/3=4팀

4) 4팀에 있는 최대 남 여 학생 수 : 여 = 4*2=8명, 남 = 4*1=4명

5) 이렇게 되면 여자가 최대 8명이 들어올 수 있지만 여학생 수 ==> 6 이므로 8명 ----> 6명으로 바뀌어야 함

마찬가지로 남자가 최대 4명이 들어올 수 있지만 남학생수가 10명이다.

남학생의 경우 이미 필요한 학생 수 보다 많은 학생이 있으므로 연산이 필요 없지만 여학생의 경우 인턴을 하는 학생을 뺐을때의 학생으로 만들 수 있는 최대 팀원에서 최대 여자 인원보다 적으므로 최대 팀 보다 적은 팀을 만들 수 있게 된다.

 

문제 해결

 

필요 변수

sum=sum/3; //남은 학생수로 만들 수 있는 최대 팀 수
int team=sum;
int Man = sum; // 최대 팀수에 최대로 들어갈 수 있는 남학생 수
int Woman = 2*sum; // 최대 팀수에 최대로 들어갈 수 있는 여학생 수

만약 인턴을 간 학생을 뺀 인원으로 만들 수 있는 최대 팀원 수의 여학생 수보다 입력받은 여학생 수가 적을경우==>최대 팀 갯수를 만들 수 없다. 여학생을 두명씩 빼가면서 최대 팀수에서 1씩 빼줘야함.

if(N<Woman){ //현 인원보다 최대 여학생 수가 클 경우 ==> 최대 팀 수를 만들 수 없다.
    while(true){
        Woman-=2;
        team--;
        if(N>=Woman){
            break;
        }
    }
}

 

마찬가지로 남학생의 경우에도 최대 팀원 수의 남학생 수 보다 입력받은 남학생 수가 적으면 최대 팀 갯수를 만들 수 없으므로 남학생을 한명씩 빼가면서  최대 팀수에서 1씩 빼줘야 한다.

if(M<Man){ //현 인원보다 최대 남학생 수가 클 경우 ==> 최대 팀 수를 만들 수 없다.
    while(true){
        Man-=1;
        team--;
        if(M>=Man){
            break;
        }
    }
}

 


 

<전체 코드>

import java.util.Scanner;

public class Problem2875 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int M = scanner.nextInt();
        int K = scanner.nextInt();

        int sum = N+M-K; // 총원에서 인턴을 하는 학생수를 뺀 학생수

        sum=sum/3; //남은 학생수로 만들 수 있는 최대 팀 수
        int team=sum;
        int Man = sum; // 최대 팀수에 최대로 들어갈 수 있는 남학생 수
        int Woman = 2*sum; // 최대 팀수에 최대로 들어갈 수 있는 여학생 수

        if(N<Woman){ //현 인원보다 최대 여학생 수가 클 경우 ==> 최대 팀 수를 만들 수 없다.
            while(true){
                Woman-=2;
                team--;
                if(N>=Woman){
                    break;
                }
            }
        }

        if(M<Man){ //현 인원보다 최대 남학생 수가 클 경우 ==> 최대 팀 수를 만들 수 없다.
            while(true){
                Man-=1;
                team--;
                if(M>=Man){
                    break;
                }
            }
        }

        System.out.println(team);

    }
}