문제 설명
N루피가 주어졌을 때, 이 돈으로 최대한 많은 물을 구입하는 것이 목표입니다. 물병의 종류에 따라 가격이 다르며, 각 병의 용량은 모두 1리터입니다.
- 플라스틱 병: 1리터당 A루피
- 유리 병: 1리터당 B루피
- 빈 병 반납: 유리 병을 반납하면 개당 E루피를 환불받을 수 있음
유리 병은 사용 후 반납하면 E루피를 돌려받으므로, 실질적인 구입 비용은 B-E루피가 됩니다. 따라서 최적의 구입 전략은 다음과 같습니다.
- 플라스틱 병 가격(A)이 여전히 B-E보다 저렴하다면 플라스틱 병만 구입합니다.
- 그렇지 않다면 유리 병을 우선적으로 최대한 구입한 뒤, 남은 돈으로 플라스틱 병을 추가로 구입합니다.
입력 및 출력 예시
예시 1
N = 6, A = 5, B = 4, E = 3;
최대 물의 양: 3리터
설명: B-E = 1이고 1 < A이므로 유리 병을 구입하는 것이 유리합니다. N-E = 3루피로 1리터짜리 유리 병 3개를 구입할 수 있습니다.
예시 2
N = 10, A = 5, B = 10, E = 3;
최대 물의 양: 2리터
설명: B-E = 7이고 7 > A이므로 플라스틱 병만 구입하는 것이 유리합니다. 10 ÷ 5 = 2개의 플라스틱 병을 구입할 수 있습니다.
알고리즘 접근 방법
- money(보유 금액), pbottle(플라스틱 병 가격), gbottle(유리 병 가격), gempty(환불액) 변수로 가격 정보와 보유 금액을 관리합니다.
- maxWater(int mny, int pb, int gb, int ge) 함수가 모든 값을 매개변수로 받아 구입 가능한 물의 양을 출력합니다.
- litrs 변수에는 계산된 물의 양(리터)이 저장됩니다.
- 유리 병의 새로운 가격(원래 가격 − 환불액)을 gb 값으로 전달합니다.
- 전달받은 gb 값이 pb 값보다 작으면, 즉 유리 병 구입이 유리하면 (mny-ge)/gb개의 유리 병을 구입합니다.
- 구입에 사용한 금액을 차감해 남은 돈을 계산합니다(mny -= litrs * gb).
- 남은 돈으로 구입할 수 있는 플라스틱 병의 수는 mny / pb개입니다.
- 전달받은 pb 값이 더 크면, 즉 플라스틱 병만 유리하면 mny / pb개의 플라스틱 병만 구입합니다.
- 두 경우 모두 결과를 출력합니다. 병 하나의 용량이 1리터이므로 병의 개수가 곧 물의 리터 수입니다.
C++ 구현 예제
// 위 접근 방식의 C++ 구현
#include<bits/stdc++.h>
using namespace std;
void maxWater(int mny,int pb,int gb,int ge){
int litrs;
// 유리 병 구입이 유리한 경우
if (gb < pb){
// 유리 병 개수
int tmp=mny-ge/gb;
litrs=tmp>0?tmp:0;
mny-=litrs*gb;
// 플라스틱 병 개수
litrs+=mny/pb;
cout<<"Maximum Liters of water : "<<litrs<<endl;
}
// 플라스틱 병만 구입하는 경우
else
cout<<"Maximum Liters of water only Plastic bottles : "<<(mny /pb)<<endl;
}
int main(){
int money = 20, pbottle=5, gbottle=10, gempty = 8;
gbottle=gbottle-gempty; // 유리 병의 새로운 가격
maxWater( money,pbottle,gbottle,gempty );
}
출력 결과
Maximum Liters of water: 14
실행 결과 money = 20, 플라스틱 병 가격 = 5, 유리 병 원래 가격 = 10, 환불액 = 8이 주어졌습니다. 유리 병의 실질 가격은 10 − 8 = 2루피로 플라스틱 병(5루피)보다 저렴하기 때문에 유리 병을 우선 구입하는 분기로 진행되며, 최종적으로 14리터의 물을 구입할 수 있습니다.