백준-2875번/대회 or 인턴 (java)
문제
백준대학교에서는 대회에 나갈 때 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);
}
}