모든 챌린지
쉬움 0명 해결 정답률 0%

가격 데코레이터

할인, 세금, 배송, 쿠폰 데코레이터를 순서대로 적용하여 기본 가격을 감쌉니다.

배우게 될 내용

  • 값 주위에 동작을 층층이 쌓기
  • 퍼센트를 올바른 순서로 적용하기
  • 값이 0 아래로 내려가지 않게 막기

문제

원문 보기 (영어)

decorator 패턴은 객체를 여러 겹으로 감싸서 동작을 추가합니다. 여기서 각 층은 안쪽에 있는 층의 가격을 변경합니다.

base_price에서 시작하여 다음 순서로 데코레이터를 적용하세요:

  • discount p: 가격을 p 퍼센트만큼 줄입니다.
  • tax p: 가격을 p 퍼센트만큼 늘립니다.
  • shipping a: 고정 금액 a를 더합니다.
  • coupon a: a를 빼되, 0 아래로는 내려가지 않습니다.

price_decorators(base_price, decorators)를 구현하세요.

Input

base_price: 시작 가격입니다.

decorators: 가격을 감싸는 순서대로 주어지는 레이어들입니다. 금액에는 소수점이 있을 수 있습니다.

Output

최종 가격을 반환하세요. 1e-6 이내의 오차는 허용됩니다.

제약 조건

0 ≤ base_price ≤ 1,000,000

0 ≤ 데코레이터 수 ≤ 100; 0 ≤ p ≤ 100, 0 ≤ a ≤ 100,000

예시

예시 1
입력:
base_price = 100
decorators = ["discount 10", "tax 8", "shipping 5"]

예상 출력:
expected = 102.2
입력:
long long base_price = 100;
std::vector<std::string> decorators = {"discount 10", "tax 8", "shipping 5"};

예상 출력:
double expected = 102.2;
입력:
long base_price = 100;
string[] decorators = new string[] {"discount 10", "tax 8", "shipping 5"};

예상 출력:
double expected = 102.2;

설명

100 − 10% = 90, 세금 8%를 더하면 97.2, 배송비 5를 더하면 102.2.

예시 2
입력:
base_price = 20
decorators = ["coupon 25", "shipping 4"]

예상 출력:
expected = 4.0
입력:
long long base_price = 20;
std::vector<std::string> decorators = {"coupon 25", "shipping 4"};

예상 출력:
double expected = 4.0;
입력:
long base_price = 20;
string[] decorators = new string[] {"coupon 25", "shipping 4"};

예상 출력:
double expected = 4.0;

설명

쿠폰이 가격을 0 아래로 내리려 하지만, 0에서 멈춥니다; 그 다음 배송비가 더해져 4가 됩니다.

접근 방법

먼저 스스로 풀어 본 뒤 힌트를 하나씩 열어 보세요.

힌트 1

주어진 순서대로 층을 적용하세요.

힌트 2

퍼센트는 원래 가격이 아니라 현재 가격에 적용됩니다.

힌트 3

쿠폰 때문에 가격이 0보다 낮아질 수는 없습니다.

예상 복잡도

시간 O(데코레이터 수), 추가 공간 O(1)

참고 자료

이 문제는 CodeUtility에 맞게 수정되었습니다. 위의 설명과 제한 조건을 따르세요.

다른 사람의 풀이 보기

커뮤니티 솔루션

아직 공개된 풀이가 없습니다. 문제를 풀고 첫 풀이를 공유하세요.