[BOJ] 2875

Posted by RoadtoS7 on January 10, 2020 · 3 mins read

문제

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

백준대학교는 뛰어난 인재들이 많아 올해에도 N명의 여학생과 M명의 남학생이 팀원을 찾고 있다.

그런데 올해에는 대회에 참여하려는 학생들 중 K명을 반드시 인턴쉽 프로그램에 참여하라는 학교의 방침이 생기게 되었다. 인턴쉽에 참여하는 학생은 대회에 참여하지 못한다.

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

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

풀이 과정

인턴쉽에 참여하는 인원을 제외한 여학생과 남학생의 수에서
여학생을 둘 씩 묶었을 때 그룹의 수와 남학생 수 두개를 비교했을 때, 둘 중에 작은 수만큼 팀을 만들 수 있다.

예를 들어서 여학생이 4명이고 남학생이 1명이라고 했을 때, 여학생을 둘 씩 묶으면 총 2개의 팀을 만들 수 있음을 알 수 있다. 하지만 하나의 팀을 만들기 위해서는 팀 당 남학생 1명도 필요한데 남학생이 1명 밖에 없기 때문에 최종적으로는 1팀만 만들 수 있다.

따라서 우리는 인턴쉽에 참여하는 인원을 제외한 여학생과 남학생의 수에서
여학생 수를 2로 나누었을 때의 몫과 남학생의 수를 비교하여 더 작은 수가 현재 인원에서 만들 수 있는 팀 수가 된다.

이제 여학생의 수와 남학생의 수로 부터 만들 수 있는 팀의 수를 구하는 방법은 만들어졌다.
그렇다면 최대 팀 수는 어떻게 구할 수 있을까?

현재 K명이 반드시 인턴쉽 프로그램에 참여해야한다.
하지만 K명 중 몇 명의 학생이 여학생이어야 하는지 혹은 남학생이어야 하는지는 제시되지 않았다.
따라서 인턴쉽에 참여하는 여학생의 수를 반복 인덱스 i로 두고 0부터 k까지 증가시키면서
각 반복에서 팀으로 구성될 수 있는 여학생 수와 남학생 수를 통해 팀 수를 구한다. 그리고 모든 반복동안에 나오는 팀 수 중에서 최대가 되는 팀의 수를 구하면 그 수가 만들 수 있는 최대의 팀 수가 된다.

코드

w,m,k = map(int, input().split()) # w = 여학생 수, m = 남학생 수, k = 인턴쉽 프로그램에 참여해야하는 학생의 수

max = -1 # max = 만들 수 있는 최대 팀 수
for i in range(k+1): # i는 인턴쉽 프로그램에 참여하는 여학생의 수에 해당한다.
    team = 0
    women = (w - i) # women = 인턴쉽 프로그램에 참여하지 않는 여학생을 둘 씩 묶었을 때, 만들 수 있는 그룹의 수
    man = m - (k-i) # k-i = 인턴쉽 프로그램에 참여하는 남학생의수 / man = 인턴쉽 프로그램에 참여하지 않는 남학생의 수
    if women > man: # 여학생을 둘 씩 묵었을 때의 그룹의 수와 남학생 수를 비교하여 더 작은 것을 팀 수로 선택한다.
        team = man
    else:
        team = women
     
    if max < select: # 이전까지의 반복에서 만들 수 있었던 최대 팀 수와 현재 반복에서 만들 수 있는 최대 팀 수를 비교한다.
        max = select
        
        
print(max)