🎃문제설명
🍗현진 치킨에서 판매하는 치킨은 양념 치킨, 후라이드 치킨, 반반 치킨으로 총 세 종류이다. 반반 치킨은 절반은 양념 치킨, 절반은 후라이드 치킨으로 이루어져있다. 양념 치킨 한 마리의 가격은 A원, 후라이드 치킨 한 마리의 가격은 B원, 반반 치킨 한 마리의 가격은 C원이다.
상도는 오늘 파티를 위해 양념 치킨 최소 X마리, 후라이드 치킨 최소 Y마리를 구매하려고 한다. 반반 치킨을 두 마리 구입해 양념 치킨 하나와 후라이드 치킨 하나를 만드는 방법도 가능하다. 상도가 치킨을 구매하는 금액의 최솟값을 구해보자.
입력
첫째 줄에 다섯 정수 A, B, C, X, Y가 주어진다.
출력
양념 치킨 최소 X마리, 후라이드 치킨 최소 Y마리를 구매하는 비용의 최솟값을 출력한다.
🔒제한
💾입출력 예
입력 | 출력 |
---|---|
1500 2000 1600 3 2 | 7900 |
1500 2000 1900 3 2 | 8500 |
1500 2000 500 90000 100000 | 100000000 |
알고리즘 분류
🌟문제 이해 및 풀이계획
✏️(반반치킨 x 2)의 가격이 {(후라이드 x 1) + (양념 x1)} 보다 작다면 X, Y중 최소값으로 (공통되는 n개) 반반치킨을 사고 나머지는 양념 or 후라이드를 계산하면 될거라고 생각했다.
✏️근데 최소 ~마리는 이상이기 때문에 공통되는 n개 이상으로 사고 치킨을 더 샀음에도 반반으로 사는게 더 싸다면 반반으로 계산해야 한다는 것을 간과해서 입력3을 틀렸다.
package BOJ;
import java.util.Scanner;
/*
* 2021.11.26 daily algo/commit
*
*/
public class boj_16917 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int A = sc.nextInt(); // 후라이드
int B = sc.nextInt(); // 양념
int C = sc.nextInt(); // 반반
int X = sc.nextInt();
int Y = sc.nextInt();
int price = 0;
if(A+B > C*2) {
price += C*2*Math.min(X, Y);
if(X > Y) { // 후라이드가 더 많을 때
if(C*2 < A) price += C*2*(X-Y);
else price += (X-Y) * A;
}
else {
if(C*2 < B) price += C*2*(Y-X);
else price += (Y-X) * B;
}
}
else {
price += A*X + B*Y;
}
System.out.println(price);
sc.close();
}
}
강의내용
✔️최소 ~마리 = ~마리 이상
✔️반반치킨을 홀수개 구매할 수 없다.
✔️핵심 포인트는 반반치킨을 몇마리 구매하느냐에 따라 다르다는 것.
✔️구매할 반반치킨의 개수를 미리 정해놓고 나머지 치킨의 개수를 판단한다.
✔️total price = (2z x C) + max(0, X-z) x A + max(0, Y-z) x B
package BOJ;
import java.util.Scanner;
/*
* 2021.11.26 daily algo/commit
*
*/
public class boj_16917 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int A = sc.nextInt(); // 후라이드
int B = sc.nextInt(); // 양념
int C = sc.nextInt(); // 반반
int X = sc.nextInt();
int Y = sc.nextInt();
int price = 0;
int min = Integer.MAX_VALUE;
int Z = 0;
for(int i=0; i<=100000; i++) {
Z = 2 * i;
price = (Z * C) + Math.max(0, X-Z/2) * A + Math.max(0, Y-Z/2) * B;
if(min > price) min = price;
}
System.out.println(min);
sc.close();
}
}
💡 for문을 전부 돌려 비교하는 식이라서 시간이 많이 걸릴 줄 알았는데 생각보다 차이가 별로 크지 않았다. (범위가 작아서 그런듯 하다)
💡 불필요한 if문을 줄여 오히려 가독성이 더 좋아진 것 같다.