[알고리즘]_그리디 알고리즘_최고의 피자🍕 (백준 No.5545)

yerim·2023년 2월 15일
0

💡 Algorithm

목록 보기
12/19
post-thumbnail

문제

상근이는 근처 피자 가게에서 매일 저녁으로 피자를 배달해 먹는다. 주머니 사정이 얇아진 상근이는 이번 달부터는 "최고의 피자"를 구매하려고 한다. 최고의 피자란, 피자 가게에서 주문할 수 있는 피자 중 1원당 열량이 가장 높은 피자를 말한다. 최고의 피자는 여러 종류가 있을 수도 있다.

이 피자 가게는 토핑 N개에서 여러 종류를 선택해서 주문할 수 있다. 같은 종류의 토핑을 2개 이상 선택할 수는 없다. 또, 토핑을 전혀 선택하지 않을 수도 있다.

선택한 토핑은 도우 위에 올라간다. 도우의 가격은 A원이고, 토핑의 가격은 모두 B원이다. 피자의 가격은 도우와 토핑의 가격의 합계가 된다. 즉, 토핑을 k종류 (0 ≤ k ≤ N) 선택했다면, 피자의 가격은 A + B*k원이 된다. 피자의 열량은 도우와 토핑의 열량의 합이다.

도우의 가격, 토핑의 가격, 그리고 도우와 각 토핑의 열량 값이 주어졌을 때, 최고의 피자의 1원 당 열량을 구하는 프로그램을 작성하시오.

입력
첫째 줄에 토핑의 종류의 수 N(1 ≤ N ≤ 100)이 주어진다.
둘째 줄에는 도우의 가격 A와 토핑의 가격 B가 주어진다. (1 ≤ A, B ≤ 1000)
셋째 줄에는 도우의 열량 C가 주어진다. (1 ≤ C ≤ 10000)
다음 줄부터 N개 줄에는 각 토핑의 열량 Di가 한 줄에 하나씩 주어진다. (1 ≤ Di ≤ 10000)

출력
첫째 줄에 최고의 피자의 1원 당 열량을 출력한다. 소수점 이하는 버리고 정수 값으로 출력한다.

💡 풀이

import java.util.Arrays;
import java.util.Scanner;

public class No_5545 {
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		int N=sc.nextInt(); // 토핑의 수

		int A= sc.nextInt(); // 도우 가격
		int B=sc.nextInt(); // 토핑 가격

		int C= sc.nextInt(); // 도우 열량

		int []D=new int[N];//토핑 개수로 배열 생성(토핑열량)

		for(int i = 0; i<N; i++){ //토핑열량
			D[i]=sc.nextInt();
		}

		Arrays.sort(D);

		int best = C/A;//토핑 없는피자의 1원당 열량
		int count =0;
		int cal=C;

		for(int i=N-1;i>=0;i--){
			count++;
			cal+=D[i];

			if(cal/(A+(B*count))>best){
				best=cal/(A+(B*count));

			}
		}
		System.out.println(best);

	}
}

설명 👨🏻‍🎨

  • 토핑은 가격이 동일하므로 제일 클수록 피자의 열량은 높아지니 Arrays.sort로 정렬한다.
    이때 내림차순으로 정렬해도 되지만 복잡하므로 나는 그냥 오름차순으로 계산하고 for문을 마지막부터 1로 돌렸다.

  • 토핑이 없는 피자가 1원당 열량이 더 높을 수 있으니까 먼저 변수(best)를 int best = C/A; 토핑 없는 피자의 1원당 열량으로 초기화한다.

  • count는 가격 계산할때 토핑개수로 계산할 변수 ~ 피자의 가격은 -> 도우 가격+(토핑 가격 * 토핑개수)

  • cal은 도우열량으로 초기화한다. (for문에서 가장 큰 열량 순서대로 +를 할꺼니껜)

  • 1원당 피자의 열량 계산식(cal/(A+(B*count))이 best보다 크다면 best변수를 바꾼다.

마무리 🤧

블로그에 설명을 좀 자세하게 쓰려고 노력중인데 많이 어렵다 힝
코드를 맞게 짠 것 같은데 실행하면 자꾸 다른 값이 나와서 하나하나 다시 살펴보니 if문 안에 best=cal 이라고 해서 자꾸 오류가 난 것이였다.. ^^ 정신차리자
그래도 아무것도 안보고 나름 금방 풀었다>_<

0개의 댓글