728x90
문제 링크 : www.acmicpc.net/problem/16917
문제
현진 치킨에서 판매하는 치킨은 양념 치킨, 후라이드 치킨, 반반 치킨으로 총 세 종류이다. 반반 치킨은 절반은 양념 치킨, 절반은 후라이드 치킨으로 이루어져있다. 양념 치킨 한 마리의 가격은 A원, 후라이드 치킨 한 마리의 가격은 B원, 반반 치킨 한 마리의 가격은 C원이다.
상도는 오늘 파티를 위해 양념 치킨 최소 X마리, 후라이드 치킨 최소 Y마리를 구매하려고 한다. 반반 치킨을 두 마리 구입해 양념 치킨 하나와 후라이드 치킨 하나를 만드는 방법도 가능하다. 상도가 치킨을 구매하는 금액의 최솟값을 구해보자.
입력
첫째 줄에 다섯 정수 A, B, C, X, Y가 주어진다.
출력
양념 치킨 최소 X마리, 후라이드 치킨 최소 Y마리를 구매하는 비용의 최솟값을 출력한다.
접근 방법
X,Y가 구입하는 "최소" 개수라는 것을 주의해야한다. 즉 최소 가격이기만 하면 추가로 더 구매할 수 있다는 것이다. (단 max(X,Y) 보다 많이 구매한다면 최소 가격이 될 수 없음)
양념, 후라이드 각각 구매하는 것 보다 반반을 두마리 구매하는게 더 싸며 X>Y 라고 가정해보자.
그럼 아래의 1) ~ 2) 사이에서 반반으로 얼마만큼 구매하느냐에 따라 가격이 달라지며, 반복문을 돌면서 최소 가격을 구한다.
1) Y마리는 반반으로 구매하고, (X-Y) 마리는 후라이드 치킨 따로 구매.
2) X마리 전부 반반으로 구매
//
// BF_BOJ16917_양념반후라이드반.cpp
// Coding_Test_Practice
//
// Created by 김난영 on 2021/04/03.
// Copyright © 2021 KimNanyoung. All rights reserved.
//
//X,Y가 구입하는 "최소" 개수라는 것을 주의해야한다.
//즉, X,Y 개 이상 구입할 수 있는 것이다.
//반복문을 돌면서 반반으로 얼마나 구매해야하는지와 그때의 최소 가격을 구한다.
#include <iostream>
using namespace std;
int main(){
int A,B,C,X,Y;
cin >> A >> B >> C >> X >> Y;
bool ischeapBanBan = A+B>2*C ? true : false; //양념 + 후라이드 각각 사는게 더 싼지 체크
long long mini = 10000000000, sum;
if(ischeapBanBan){
if(X>Y) {
for(int i = Y; i<=X; i++){
sum = 2*C*i + (X-i)*A; //(X-i) : 반반 구매하고 더 구매해야 하는 양념 치킨 수
if(sum<mini) {mini = sum;}
}
}
else {
for(int i = X; i<=Y; i++){
sum = 2*C*i + (Y-i)*B; //(Y-i) : 반반 구매하고 더 구매해야 하는 후라이드 치킨 수
if(sum<mini) {mini = sum;}
}
}
}
else{
mini = A*X + B*Y;
}
cout << mini;
return 0;
}
728x90
'Algorithm(BOJ) > Brute Force' 카테고리의 다른 글
[C++] 백준 16936번 - 나3곱2(완전탐색 / DFS) (0) | 2021.04.04 |
---|---|
[C++] 백준 16922번 - 로마 숫자 만들기 (중복 조합) (0) | 2021.04.03 |
[C++] 백준 16968번 - 차량 번호판 1 (0) | 2021.04.03 |
[C++] 백준 10972번 - 다음 순열 (0) | 2021.02.13 |
[C++] 백준 11723번 - 집합 (배열/비트마스크) (0) | 2021.02.13 |