[BOJ 26070] - 곰곰이와 학식 (그리디, Python)

보양쿠·2022년 12월 1일
0

BOJ

목록 보기
81/251

제2회 곰곰컵 풀이

A - 치킨댄스를 추는 곰곰이를 본 임스 2 풀이
B - 붙임성 좋은 총총이 풀이
C - 곰곰이와 학식 풀이
D - 오락실에 간 총총이 풀이
E - 곰곰이와 시소 풀이
F - 외로운 곰곰이는 친구가 있어요 풀이
G - 곰곰이와 테트리스 풀이
H - 곰곰아 선 넘지마 풀이
I - 곰곰이의 식단 관리 2 풀이
J - 서커스 나이트 풀이

BOJ 26070 - 곰곰이와 학식 링크
(2022.12.01 기준 S4)

문제

치킨 식권 X장, 피자 식권 Y장, 햄버거 식권 Z장을 가지고 있고
치킨 식권 3장을 피자 식권 1장으로, 피자 식권 3장을 햄버거 식권 1장으로, 햄버거 식권 3장을 치킨 식권 1장으로 교환이 가능하다.
치킨을 먹고 싶은 곰곰이 A 마리, 피자를 먹고 싶은 곰곰이 B마리, 햄버거를 먹고 싶은 곰곰이 C마리가 있을 때, 최대한 먹을 수 있는 곰곰이의 최대 마릿수 출력

알고리즘

각 식권은 교환 가능하지만, 교환 전에 원하는 음식으로 바꿀 수 있는데, 교환 후에 바꿔버리면 무조건 손해다. 그러므로 현재 상태에서 최대한 교환하고 다른 식권으로 교환하는 그리디로 해결해야 한다.

풀이

현재 상태에 식권으로 최대한 음식으로 교환 가능한 만큼 교환하고 다음 식권으로 교환해야 한다.
그리고 이는 3번만 반복하면 된다.
교환을 3번 후 4번째 상황에선 결국 원래 식권으로 돌아오기 때문.

코드

A, B, C = map(int, input().split())
X, Y, Z = map(int, input().split())
answer = 0

# 각 X, Y, Z 식권 3장은 각 Y, Z, X 1장으로 바꿀 수 있다.
# 결국 현재 식권으로 최대한 음식으로 교환 후, 다음 식권으로 교환
# 이를 총 3번하면 된다.
# 4번째에선 원래 식권으로 돌아오기 때문.

for _ in range(3):
    # 가능한 최대 치킨 수
    chicken = min(A, X)
    answer += chicken
    A -= chicken
    X -= chicken
    # 가능한 최대 피자 수
    pizza = min(B, Y)
    answer += pizza
    B -= pizza
    Y -= pizza
    # 가능한 최대 햄버거 수
    burger = min(C, Z)
    answer += burger
    C -= burger
    Z -= burger
    
    # 각 X, Y, Z 식권 3장은 각 Y, Z, X 1장으로 교환
    Y, Z, X = X // 3, Y // 3, Z // 3

print(answer)
profile
GNU 16 statistics & computer science

0개의 댓글