[C]백준_2520 : 팬케이크 사랑

Alal11·2023년 3월 16일
0
post-thumbnail

출처

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


문제

오늘은 내가 팬케이크 요리사!

은주는 팬케이크를 만들기로 했다. 은주 앞에는 지금 재료들이 있다. 이 재료들을 보고 있자니, 팬케이크를 최대 몇 개나 만들 수 있을지 궁금해졌다.

팬케이크를 만들기 위해서는 먼저 반죽을 해야 한다. 우유 8컵, 계란 노른자 8개, 설탕 4스푼, 소금 1스푼, 밀가루 9컵이 있으면 팬케이크 반죽 16개를 만들 수 있다. 어떤 0 이상의 실수 x에 대해 모든 재료가 앞에 주어진 양의 x배 이상 있다면 은주는 ⌊16x⌋개의 반죽을 만들 수 있다.

그 다음 반죽에 토핑을 얹고 구우면 팬케이크가 만들어진다. 은주가 만들 수 있는 팬케이크의 종류와 각각에 필요한 토핑의 목록은 다음과 같다.

  • 바나나 팬케이크: 바나나 1개
  • 딸기 팬케이크: 딸기잼 30그램
  • 초콜릿 팬케이크: 초콜릿 스프레드 25그램
  • 호두 팬케이크: 호두 10개

바나나는 여러 조각으로 나누거나 여러 조각을 합쳐서 사용할 수 있다. 예를 들어 1/3 크기의 바나나 조각이 3개 있으면 하나로 합쳐서 바나나 팬케이크를 만들 수 있다.

은주가 가지고 있는 재료들의 양이 주어졌을 때, 만들 수 있는 팬케이크의 최대 개수를 구하는 프로그램을 작성하시오.


입력

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 빈 줄로 구분되며, 두 줄로 이루어져 있다.

테스트케이스의 첫째 줄에는 5개의 정수가 있다. 처음부터 차례대로 cm, y, ssu, ssa, f이다. 은주는 우유 cm컵, 계란 노른자 y개, 설탕 ssu스푼, 소금 ssa스푼, 밀가루 f컵을 가지고 있는 것이다.

두 번째 줄에는 4개의 정수가 있다. 이 수는 b, gs, gc, w이다. 은주는 바나나 b개, 딸기잼 gs그램, 초콜릿 gc그램, 호두 w개가 있다.

주어지는 모든 양은 0보다 크거나 같고, 106보다 작거나 같다.


출력

각 테스트 케이스에 대해 한 줄에 하나의 정수를 출력한다. 이 정수는 은주가 만들 수 있는 팬케이크의 최대 개수이다.


예제 입출력


힌트

첫 번째 테스트 케이스에서 주어진 재료를 가지고 바나나 팬케익 10개, 딸기 팬케익 1개, 초콜릿 팬케익 4개, 호두 팬케익 1개를 만들 수 있다.

두 번째 테스트 케이스에서 주어진 재료 중 밀가루가 팬케익 30개를 만들 수 있는 양이다.


알고리즘 분류

  • 수학
  • 구현
  • 사칙연산
  • 메모

➡️문제 분석

문제에서 우유 8컵, 계란 노른자 8개, 설탕 4스푼, 소금 1스푼, 밀가루 9컵이 있으면 팬케이크 반죽 16개를 만들 수 있다고 한다.

따라서 반죽 1개를 만들려면 우유 0.5컵, 계란 노른자 0.5개, 설탕 0.25스푼, 소금 0.0625스푼, 밀가루 0.5625컵이 있어야 한다.

토핑에 필요한 재료는 각각 팬케이크 마다

  • 바나나 팬케이크: 바나나 1개
  • 딸기 팬케이크: 딸기잼 30그램
  • 초콜릿 팬케이크: 초콜릿 스프레드 25그램
  • 호두 팬케이크: 호두 10개

이다.


➡️코드(⭕)

#include <stdio.h>

int main()
{
	int T;
	double dough[] = { 0.5, 0.5, 0.25, 0.0625, 0.5625 };	// 반죽 1개 당 필요한 재료
	int topping[] = { 1, 30, 25, 10 };		// 팬케이크 1개 당 각 토핑에 필요한 재료

	scanf("%d", &T);

	while (T--)				// 테스트 케이스가 0이 되면 반복 멈춤
	{
		scanf("\n");		// 공백 입력받음

		int line1[5];
		int line2[4];
		int max_dough = 1000000000;

		// 첫째 줄에 5개의 재료 입력받음 
		for (int i = 0; i < 5; i++)
		{
			scanf("%d", &line1[i]);
			int max = line1[i] / dough[i];	// 각 재료 당 팬케이크를 만들 수 있는 개수

			// 재료 중 가장 작은 값이 최대로 만들 수 있는 반죽 개수
			if (max_dough > max)
				max_dough = max;
		}

		int cnt = 0;
		
		// 둘째 줄에 4개의 토핑 입력받음
		for (int i = 0; i < 4; i++)
		{
			scanf("%d", &line2[i]);
			cnt += line2[i] / topping[i];	// 각 토핑 당 팬케이크를 만들 수 있는 개수의 누적합
		}

		// 반죽과 토핑 중 크기가 작은 값이 팬케이크의 최대 개수
		if (max_dough < cnt)
			printf("%d\n", max_dough);
		else
			printf("%d\n", cnt);
	}
	return 0;
}

➡️코드 분석

  1. 반죽 1개 당 필요한 재료를 dough[] 배열에 넣어주고, 팬케이크 토핑따라 필요한 재료를 topping[] 배열에 넣어준다.

  2. 테스트 케이스 T를 입력받고, 무한 반복문으로 T--를 해주어 T가 0이되면 멈추게 해준다.

  3. 첫째 줄에 5개의 재료를 입력받고, 각 재료 당 팬케이크를 만들 수 있는 개수를 max에 넣어주는데, 재료 중 가장 작은 값이 최대로 만들 수 있는 반죽 개수 max_dough가 된다.

  4. 둘째 줄에 4개의 토핑을 입력받고, 각 토핑 당 팬케이크를 만들 수 있는 개수를 cnt에 누적하여 더해준다.

  5. 반죽과 토핑의 크기를 비교하여 둘 중에 작은 값이 팬케이크를 만들 수 있는 최대 개수가 된다.


➡️end

요새 뭔가 싱숭생숭하다.. 새학기라 그런가 뭔가 산만하고 집중도 안되고ㅠㅜ 이것도 전에 미리 해놓은 포스팅 그대로 올리는거라 요새 정말 아무것도 안하고 있다..!!! 얼른 마음 다잡고 열심히 해보자 하.. 파이팅!!!!!

0개의 댓글