알고리즘 공부/탐욕알고리즘(Greedy)

백준 2875 ( 대회 or 인턴)

kdhoooon 2021. 1. 17. 19:02

문제


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

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

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

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

 

 

 

풀이


(여학생수(N) + 남학생수(M) - 인턴십 참여인원(K)) / 3(여학생 : 2, 남학생 1) = T(인원수를 고려안한 최대팀 개수).

 

이렇게 나온 최대 팀 개수 중 여학생 수와 남학생 수를 고려해서 바꿔주어야한다.

이미 인턴십 참여인원이 빠졌는데 팀을 채울 수 없을만큼의 학생이 있다면, 최대팀은 한쪽 성의 학생들에게 맞춰야한다.

 

T * 2 < N 이라면 M의 수가 N / 2 보다 많다는 것이므로 N / 2 만큼의 팀만 존재할 수 있다. 이경우 K 수만큼의 학생은 남학생이 참여하면 된다.

 

T < M 이라면 N / 2 의 수가 M 보다 많다는 것이므로 M 만큼의 팀만 존재할 수 있다. 이경우 K 수만큼 여학생이 인턴심을 참여하면 된다.

 

이 두가지 경우가 모두 포함이 안된다면 남녀 수의 적절한 인원이 인턴십으로 빠진 뒤 팀이 형성되는 경우가 된다.

<코드>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {	
	static StringBuilder sb = new StringBuilder();
	
	public static void main(String[] args) throws IOException{
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	
		String[] number = br.readLine().split("\\s");
		
		int n = Integer.parseInt(number[0]);
		int m = Integer.parseInt(number[1]);
		int k = Integer.parseInt(number[2]);
		
		int ans = (n + m - k) / 3;
		
		if(ans * 2 > n) {
			ans = n / 2;
		}else if(ans > m) {
			ans = m;
		}
		
		System.out.println(ans);
	}
}

'알고리즘 공부 > 탐욕알고리즘(Greedy)' 카테고리의 다른 글

백준 2873 (롤러코스터)  (0) 2021.01.21
백준 1931(회의실 배정)  (0) 2021.01.19
백준 1783(병든 나이트)  (0) 2021.01.18
백준 10610 (30) / 배수판별법  (0) 2021.01.17
백준 11047(동전 0)  (0) 2021.01.17