알고리즘/백준

[백준 26070] 곰곰이와 학식 (C++)

fortissimo 2025. 2. 22. 23:19

https://www.acmicpc.net/problem/26070

문제


지금 곰곰대학교 학생식당에는 시험기간에 밤을 새, 굶주려 있는 곰곰이들이 기다리고 있다.

정확히는 치킨을 먹고 싶은 곰곰이가 A마리, 피자를 먹고 싶은 곰곰이가 B마리, 햄버거를 먹고 싶은 곰곰이가 C마리 있다.

총총선배는 사비를 털어 곰곰이들에게 맛있는 밥을 사주려 한다!

총총선배는 학생식당에서 사용할 수 있는 치킨 식권 X장, 피자 식권 Y장, 햄버거 식권 Z장을 가지고 있다. 식권 한장을 내면, 해당 음식 1인분으로 교환받을 수 있다.

또, 식당에서는 치킨 식권 3장을 피자 식권 1장으로, 피자 식권 3장을 햄버거 식권 1장으로, 햄버거 식권 3장을 치킨 식권 1장으로 교환해주는 이벤트도 하고 있다.

곰곰이들을 최대한 배불리 먹이고 싶은 총총선배는 당신에게 도움을 요청하고 있다!

굶주린 곰곰이들을 위해, 식권과 이벤트를 적절히 활용했을 때 배불리 먹일 수 있는 곰곰이의 최대 마릿수를 구해주자.

입력


첫 번째 줄에 치킨을 먹고 싶은 곰곰이의 마릿수 A, 피자를 먹고 싶은 곰곰이의 마릿수 B, 햄버거를 먹고 싶은 곰곰이의 마릿수 C가 공백으로 구분되어 주어진다. (0 ≤ A,B,C ≤ 109)

두 번째 줄에 총총이가 가지고 있는 치킨 식권 장수 X, 피자 식권 장수 Y, 햄버거 식권 장수 Z가 공백으로 구분되어 주어진다. (0 ≤ X,Y,Z ≤ 109)

입력은 모두 정수로 주어진다.

출력


주어진 식권과 이벤트를 적절히 활용해, 배불리 먹일 수 있는 곰곰이의 최대 마릿수를 출력하자.

 

문제 풀이


그리디 문제.

각 음식에 해당하는 식권으로는 1 사람당 1장씩 교환이 된다. 따라서 각 인원 수와 식권 장 수를 비교해 작은쪽의 수만큼 배불리 먹일 수 있다.

치킨 식권 3장 -> 피자 식권 1장, 피자 식권 3장 -> 햄버거 식권 1장, 햄버거 식권 3장 -> 치킨 식권 1장이므로 3장 당 다른 음식으로 교환할 수 있다. 바꾼 식권을 3장 모으면 또 다른 식권으로 바꿀 수 있으므로 9장 당 또 다른 음식으로 교환할 수 있다.

 

아래는 코드.

더보기
#include <iostream>
using namespace std;
long long A, B, C;
long long X, Y, Z;
long long answer = 0;

void firstChange(long long& a, long long& b)
{
	long long first = min(a, b);
	a -= first;
	b -= first;
	answer += first;
}

void secondChange(long long& a, long long& b)
{
	long long second = min(a, b / 3);
	a -= second;
	b -= second * 3;
	answer += second;
}

void thirdChange(long long& a, long long& b)
{
	long long third = min(a, b / 9);
	a -= third;
	b -= third * 9;
	answer += third;
}

int main()
{
	cin.tie(NULL);
	ios::sync_with_stdio(false);

	cin >> A >> B >> C;
	cin >> X >> Y >> Z;
	firstChange(A, X);
	firstChange(B, Y);
	firstChange(C, Z);
	secondChange(C, Y);
	secondChange(B, X);
	secondChange(A, Z);
	thirdChange(A, Y);
	thirdChange(B, Z);
	thirdChange(C, X);
	cout << answer << "\n";
	return 0;
}