대회 or 인턴
https://www.acmicpc.net/problem/2875
문제
백준대학교에서는 대회에 나갈 때 2명의 여학생과 1명의 남학생이 팀을 결성해서 나가는 것이 원칙이다. (왜인지는 총장님께 여쭈어보는 것이 좋겠다.)
백준대학교는 뛰어난 인재들이 많아 올해에도 N명의 여학생과 M명의 남학생이 팀원을 찾고 있다. 대회에 참여하려는 학생들 중 K명은 반드시 인턴쉽 프로그램에 참여해야 한다. 인턴쉽에 참여하는 학생은 대회에 참여하지 못한다.
백준대학교에서는 뛰어난 인재들이 많기 때문에, 많은 팀을 만드는 것이 최선이다.
여러분은 여학생의 수 N, 남학생의 수 M, 인턴쉽에 참여해야하는 인원 K가 주어질 때 만들 수 있는 최대의 팀 수를 구하면 된다.
입력
첫째 줄에 N, M, K가 순서대로 주어진다. (0 ≤ M ≤ 100, 0 ≤ N ≤ 100, 0 ≤ K ≤ M+N),
출력
만들 수 있는 팀의 최대 개수을 출력하면 된다.
예제 입력 1
6 3 2
예제 출력 1
2
예제 입력 2
2 1 1
예제 출력 2
0
예제 입력 3
6 10 3
예제 출력 3
3
코드
import sys
input = sys.stdin.readline
n, m, k = map(int, input().split())
team = 0
while n-2 >= 0 and m-1 >= 0 and n+m >= k+3:
n -= 2
m -= 1
team += 1
print(team)
풀이
while문을 보면 팀을 결성하기 위한 조건인 여자 수가 2보다 크거나 같으면서 남자 수가 1보다 크거나 같다는 것과 인턴쉽 프로그램에 반드시 참가시켜야 하는 조건인 (여자수 + 남자수)가 (인턴쉽 참여해야 하는 인원 + 팀을 이루기 위한 인원)보다 크거나 같아야 팀 수를 의미하는 team 변수를 1만큼 늘려줄 수 있다.
처음 문제를 풀 때 아주 치명적인 실수를 했다. 내가 처음 작성한 코드는 아래와 같다.
import sys
input = sys.stdin.readline
n, m, k = map(int, input().split())
team = 0
while n-2 >= 0 and m-1 >= 0:
n -= 2
m -= 1
team += 1
if n + m >= k:
print(team)
else:
print(team-1)
이는 우선 팀을 결성하기 위한 조건만 만족시키면 team 변수를 1만큼 늘려주고, 마지막에 남은 인원이 k보다 크거나 같으면 team 변수를 그대로 출력하고, 작다면 team을 하나 제외시켜 출력시켜준다는 의미로 작성하였다.
주어진 테스트 케이스도 전부 통과하여 어떤 부분이 문제인지 찾기 힘들었지만 n = 6, m = 3, k = 4인 경우 실제 답은 1이어야 하나 위 코드 실행 시 2가 출력되기 때문이다.
따라서 조건을 작성해줄 때, 특정 경우의 수가 누락되지 않도록 조건을 최대한 한 번에 작성할 수 있도록 연습해야겠다.
'Python > Coding Test' 카테고리의 다른 글
[백준] 24479 : 알고리즘 수업 - 깊이 우선 탐색 1 (인접 행렬, 인접 리스트 이용) (1) | 2024.01.30 |
---|---|
[백준] 1931 : 회의실 배정 (0) | 2023.11.15 |
[알고리즘] 분할정복 (0) | 2023.11.14 |
[백준] 10815 : 숫자 카드 (0) | 2023.11.13 |
[백준] 2110 : 공유기 설치 (0) | 2023.11.13 |