본문 바로가기

백준/JAVA

[Baekjoon/JAVA] 2520번 - 팬케이크 사랑

[백준] Baekjoon Online Judge

문제로 이동

 

문제

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

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

팬케이크를 만들기 위해서는 먼저 반죽을 해야 한다. 우유 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보다 작거나 같다.

 

출력

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

 


예제 입력 예제 출력
2

16 16 8 2 17
10 47 100 19

16 16 8 2 17
10 470 100 19
16
30

풀이

import java.util.Scanner;

public class Main {
    static double[] needPancake = {0.5, 0.5, 0.25, 0.0625, 0.5625};
    static int[] needTopping = {1, 30, 25, 10};

    public static void main(String[] args)  {
        Scanner in = new Scanner(System.in);

        int t = in.nextInt(); // 테스트 케이스

        // 은주가 만들 수 있는 팬케이크의 최대 개수 구하기
        for (int i = 0; i < t; i++) {
            double canMake1 = 0; // 현재 재료로 만들 수 있는 팬케이크의 수

            for (int j = 0; j < 5; j++) {
                int n = in.nextInt();
                n /= needPancake[j];

                if (j == 0 || n < canMake1) canMake1 = n;
            }

            int canMake2 = 0; // 토핑만 봤을 때 만들 수 있는 팬케이크 수

            for (int j = 0; j < 4; j++) {
                int n = in.nextInt();
                canMake2 += (n / needTopping[j]);
            }

            // 출력
            System.out.println((int) Math.min(canMake1, canMake2));
        }
    }
}

needPancake[]에 팬케이크 1개 분량의 반죽을 만드는데 필요한 재료의 양을, needTopping[]에는 팬케이크 1개를 만드는데 필요한 토핑을 양을 미리 저장했다.

입력 받은 반죽 재료를 needPancake 값으로 나눠 그 중 가장 작은 수를 찾아 canMake1에 저장했다. 가장 양이 적은 재료를 기준으로 만들 수 있는 팬케이크 반죽의 양이 정해지기 때문이다.

입력 받은 토핑의 수도 needTopping의 값으로 나눠서 총 몇개의 팬케이크를 만들 수 있는 지 구해 canMake2에 저장했다.

팬케이크 만들기에는 반죽과 토핑이 모두 필요하기에 위에서 구한 canMake1와 canMake2 중 작은 것을 출력하면 된다.