BOJ [Bronze III] 대회 or 인턴 - 2875

다히·2023년 2월 2일
0

BOJ

목록 보기
29/45

문제 링크

분류

사칙연산(arithmetic), 구현(implementation), 수학(math)

문제 설명

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

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

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

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

입력

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

출력

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

입출력 예

TC 1TC 2TC 3TC 4
입력6 3 22 1 16 10 34 2 3
출력2031

내 코드 1: 맞았습니다🤔😐

n, m, k = map(int, input().split())
result = 0
while k != 0: 
    if n > 2*m:
        n -= 1
    elif n < 2*m:
        m -= 1        
    else:  # 같아졌으면 일단 여자 빼기
        n -= 1
    k -= 1
if n >= 2*m:
    result = m
else:
    result = n // 2  # 몫
print(result)
  • 문제 조건 맞출라고 하나하나 챙겨준 코드

  • 여 : 남 = 2 : 1 의 비율이 맞을 때는 남자를 빼든 여자를 빼든 큰 상관은 없지만 우선 여자를 빼줌

  • 너무 구구절절 코드 같아서 마음에 안 듦


내 코드 2: 맞았습니다😐

n, m, k = map(int, input().split())
for i in range(k):
    if n >= 2*m:
        n -= 1
    else:
        m -= 1
    
print(min(n//2, m))
  • 큰 의미는 없지만 .. while문을 for문으로 바꿔줬고 n == 2*m일 때도 그냥 n > 2*m 일 때랑 n -= 1로 합쳐줌

  • 마지막 출력할 때 다시 또 n과 2m을 비교해서 출력하던 것을 min()으로 바꿔줬음


다른 사람 코드😯

n, m, k = map(int, input().split())	
result = 0
while n >= 2 and m >= 1 and n + m - 3>= k:	
    n -= 2
    m -= 1
    result += 1
print(result)
  • 팀을 꾸릴 수 있는 최소 조건을 한 줄로 구현

    여자는 2명 이상, 남자는 1명 이상 있으면서, 한 팀을 만들고 남는 인원이 빠져야 할 인원보다는 커야 함

    한 팀을 만들게 되면 여자 2 + 남자 1, 총 3명이 빠지게 되므로 남는 인원은 n + m - 3이 되고, 인턴십으로 빠져야 할 인원보다 남는 인원이 많은 동안에는 팀을 계숙 만들 수 있음



  • 너무 조건 하나하나 맞춰줄려고 생각하다가 + 꼬아서 생각하다가 시간이 좀 걸렸음 ㅜ ㅜ

  • 문제에서 원하는 걸 한 번 행하기 위해서 갖춰져야 할 최소 조건을 먼저 손으로 적어보는 게 도움이 되는 것 같다

0개의 댓글