[백준 15083] Life Savings (C#, C++) - soo:bak
작성일 :
문제 링크
설명
전체 구매 할인 쿠폰 한 장과 개별 상품 할인 쿠폰 두 장 중 어느 쪽이 더 절약되는지 비교하는 문제입니다.
접근법
첫 번째 쿠폰은 전체 구매액에 적용하고, 두 번째와 세 번째 쿠폰은 서로 다른 두 물건에 각각 적용합니다. 전체 쿠폰의 절약액은 총 구매액에 할인율을 곱해 구합니다.
개별 쿠폰의 절약액을 최대로 하려면 높은 할인율을 비싼 물건에 적용해야 합니다. 물건 가격과 쿠폰 할인율을 각각 내림차순 정렬한 뒤, 가장 비싼 물건에 가장 높은 할인율을, 두 번째 비싼 물건에 두 번째 할인율을 적용합니다. 두 절약액을 비교해 더 큰 쪽을 출력합니다.
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Linq;
class Program {
static void Main() {
var p = Console.ReadLine()!.Split().Select(int.Parse).ToArray();
var c = Console.ReadLine()!.Split().Select(int.Parse).ToArray();
var sum = p.Sum();
var save1 = sum * c[0] / 100.0;
Array.Sort(p);
Array.Reverse(p);
var coupons = new[] { c[1], c[2] };
Array.Sort(coupons);
Array.Reverse(coupons);
var save2 = p[0] * coupons[0] / 100.0 + p[1] * coupons[1] / 100.0;
if (save1 > save2) Console.WriteLine($"one {save1:F2}");
else Console.WriteLine($"two {save2:F2}");
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
vi p(3), c(3);
for (int i = 0; i < 3; i++)
cin >> p[i];
for (int i = 0; i < 3; i++)
cin >> c[i];
double save1 = (p[0] + p[1] + p[2]) * c[0] / 100.0;
sort(p.begin(), p.end(), greater<int>());
vi cp = {c[1], c[2]};
sort(cp.begin(), cp.end(), greater<int>());
double save2 = p[0] * cp[0] / 100.0 + p[1] * cp[1] / 100.0;
cout << fixed << setprecision(2);
if (save1 > save2) cout << "one " << save1 << "\n";
else cout << "two " << save2 << "\n";
return 0;
}