작성일 :

문제 링크

15083번 - Life Savings

설명

전체 구매 할인 쿠폰 한 장과 개별 상품 할인 쿠폰 두 장 중 어느 쪽이 더 절약되는지 비교하는 문제입니다.


접근법

첫 번째 쿠폰은 전체 구매액에 적용하고, 두 번째와 세 번째 쿠폰은 서로 다른 두 물건에 각각 적용합니다. 전체 쿠폰의 절약액은 총 구매액에 할인율을 곱해 구합니다.

개별 쿠폰의 절약액을 최대로 하려면 높은 할인율을 비싼 물건에 적용해야 합니다. 물건 가격과 쿠폰 할인율을 각각 내림차순 정렬한 뒤, 가장 비싼 물건에 가장 높은 할인율을, 두 번째 비싼 물건에 두 번째 할인율을 적용합니다. 두 절약액을 비교해 더 큰 쪽을 출력합니다.


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