https://www.acmicpc.net/problem/5545
문제
상근이는 근처 피자 가게에서 매일 저녁으로 피자를 배달해 먹는다. 주머니 사정이 얇아진 상근이는 이번 달부터는 "최고의 피자"를 구매하려고 한다. 최고의 피자란, 피자 가게에서 주문할 수 있는 피자 중 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원 당 열량을 출력한다. 소수점 이하는 버리고 정수 값으로 출력한다.
해설
피자를 만드는데 도우는 무조건 있어야 하며, 토핑은 꼭 올라갈 필요가 없다.
열량이 최대로 되게 하는 과정을 찾으면 된다.
먼저 빵의 1원당 열량과토핑의 1원당 칼로리를 비교해본다.
문제의 예시를 보면
빵의 1원당 열량: 200 / 12 -> 16.66667
토핑 별 1원당 열량: 50 / 2 -> 25300 / 2 -> 150100 / 2 -> 50
열량은 미리 내림차순으로 정렬하여 큰 것부터 원래의 열량에 더해 비교를 해보자.
예시를 보며 이해를 해보자.
(200 + 300) / (12 + 2) = 500 / 14 = 35.7142857.....
이제 열량이 100, 50인 토핑들이 남았다.
이들의 1원 당 열량을 보면 100일 때 35.7142...보다 크므로 열량과 가격을 더해준다.
이와 같은 방법을 반복하며 최고의 피자의 최대 열량을 찾아내면 된다.
소스 코드
fun main() = with(System.`in`.bufferedReader()) {
val n = readLine().toInt()
val (a, b) = readLine().split(" ").map { it.toInt() }
val calorie = readLine().toInt()
val toppingCalorie = IntArray(n)
repeat(n) { i -> toppingCalorie[i] = readLine().toInt() }
toppingCalorie.sortDescending()
var totalCalorie = calorie.toDouble()
var totalPrice = a.toDouble()
repeat(n) { i ->
if((totalCalorie / totalPrice) < (toppingCalorie[i] / b)) {
totalCalorie += toppingCalorie[i]
totalPrice += b
}
}
println((totalCalorie / totalPrice).toInt())
}
'PS(Problem Solving) > BOJ' 카테고리의 다른 글
[백준/BOJ] 3758번: KCPC (0) | 2022.03.06 |
---|---|
[백준/BOJ] 13251번: 조약돌 꺼내기 (0) | 2022.03.03 |
[백준/BOJ] 17952번: 과제는 끝나지 않아! (0) | 2022.03.02 |
[백준/BOJ] 11053번: 가장 긴 증가하는 부분 수열 (0) | 2022.03.01 |
[백준/BOJ] 17390번: 이건 꼭 풀어야 해! (0) | 2022.02.27 |
댓글