[BOJ] 양념 반 후라이드 반 - 16917번

이나영·2021년 11월 26일
0

알고리즘

목록 보기
2/17
post-thumbnail

🍭 "양념 반 후라이드 반" - 16917번 B3

🎃문제설명

🍗현진 치킨에서 판매하는 치킨은 양념 치킨, 후라이드 치킨, 반반 치킨으로 총 세 종류이다. 반반 치킨은 절반은 양념 치킨, 절반은 후라이드 치킨으로 이루어져있다. 양념 치킨 한 마리의 가격은 A원, 후라이드 치킨 한 마리의 가격은 B원, 반반 치킨 한 마리의 가격은 C원이다.

상도는 오늘 파티를 위해 양념 치킨 최소 X마리, 후라이드 치킨 최소 Y마리를 구매하려고 한다. 반반 치킨을 두 마리 구입해 양념 치킨 하나와 후라이드 치킨 하나를 만드는 방법도 가능하다. 상도가 치킨을 구매하는 금액의 최솟값을 구해보자.


입력

첫째 줄에 다섯 정수 A, B, C, X, Y가 주어진다.


출력

양념 치킨 최소 X마리, 후라이드 치킨 최소 Y마리를 구매하는 비용의 최솟값을 출력한다.


🔒제한

  • 1 ≤ A, B, C ≤ 5,000
  • 1 ≤ X, Y ≤ 100,000

💾입출력 예

입력출력
1500 2000 1600 3 27900
1500 2000 1900 3 28500
1500 2000 500 90000 100000100000000

알고리즘 분류

  • 수학
  • 구현
  • 사칙연산
  • 브루트 포스

🌟문제 이해 및 풀이계획

✏️(반반치킨 x 2)의 가격이 {(후라이드 x 1) + (양념 x1)} 보다 작다면 X, Y중 최소값으로 (공통되는 n개) 반반치킨을 사고 나머지는 양념 or 후라이드를 계산하면 될거라고 생각했다.
✏️근데 최소 ~마리는 이상이기 때문에 공통되는 n개 이상으로 사고 치킨을 더 샀음에도 반반으로 사는게 더 싸다면 반반으로 계산해야 한다는 것을 간과해서 입력3을 틀렸다.


✍🏻내 코드1 - 정답코드

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();
	}

}

강의내용

✔️최소 ~마리 = ~마리 이상
✔️반반치킨을 홀수개 구매할 수 없다.
✔️핵심 포인트는 반반치킨을 몇마리 구매하느냐에 따라 다르다는 것.
✔️구매할 반반치킨의 개수를 미리 정해놓고 나머지 치킨의 개수를 판단한다.

  • 반반치킨 z개, 후라이드 (x - z/2)개, 양념 (y - z/2)개
  • 가능한 z의 범위는 0 <= z <= 100,000
  • z의 범위를 for문으로 모두 돌려서 제일 작은 값을 구한다.

✔️total price = (2z x C) + max(0, X-z) x A + max(0, Y-z) x B

✍🏻내 코드2 + 강의

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문을 줄여 오히려 가독성이 더 좋아진 것 같다.

profile
소통하는 백엔드 개발자로 성장하기

0개의 댓글