요청마다 기본 요금과 포함 이용량이 있어요. 일반 요금은 기본 요금에 '포함량을 초과한 이용량 × 초과 단가'를 더해요. 포함량 이하로 이용해도 기본 요금은 내요. 상한 요금은 일반 요금을 먼저 계산한 뒤 상한보다 크면 상한까지만 내요.
int solution(vector<vector<int>> requests)의 각 행은 [종류, 기본 요금, 포함량, 초과 단가, 상한, 이용량]이에요. 종류 0은 일반, 1은 상한 요금이에요. 종류 0의 상한은 사용하지 않아요. 두 빈칸을 채워 전체 요청의 요금 합을 반환해 주세요.
행 수는 050, 각 행 길이는 6이에요. 종류는 0 또는 1, 기본 요금·포함량·초과 단가는 각각 0100, 상한과 이용량은 0~1,000이에요. 빈 요청이면 0이에요. 같은 요청도 각각 계산하며 반환형은 int예요.
예시 1: requests = {{0, 10, 3, 2, 0, 5}, {1, 10, 3, 2, 12, 5}} → 26. 일반 요금 14와 상한 적용 후 12를 더해요.
예시 2: requests = {{1, 20, 10, 3, 15, 4}, {0, 20, 10, 3, 0, 4}} → 35. 포함량 안의 이용이라 기본 요금 20이고, 상한 종류만 15가 돼요.
실행 입력은 첫 줄 N, 다음 N줄에 행의 여섯 값이에요. main은 채점용이며 합을 출력해요. 작성 대상은 두 빈칸이에요.
예시 입력
2
0 10 3 2 0 5
1 10 3 2 12 5
예상 결과
26
예시 입력
2
1 20 10 3 15 4
0 20 10 3 0 4
예상 결과
35
핵심 개념
oop-inheritance-poly: 기반 함수와 파생 함수의 호출을 연결해요.
oop-class: 생성자와 멤버의 단위를 읽어요.
function-design: 보조 함수의 계약과 결과 조합을 확인해요.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Plan {
protected:
int base, included, rate;
public:
Plan(int b, int f, int r) : base(b), included(f), rate(r) {}
virtual int price(int uses) const {
return base + /*@blank1@*/;
}
virtual ~Plan() {}
};
class CappedPlan : public Plan {
int cap;
public:
CappedPlan(int b, int f, int r, int c) : Plan(b, f, r), cap(c) {}
int price(int uses) const override {
return /*@blank2@*/;
}
};
int bill(const Plan& plan, int uses) { return plan.price(uses); }
int solution(vector<vector<int>> requests) {
int total = 0;
for (vector<int> row : requests) {
if (row[0] == 0) {
Plan plan(row[1], row[2], row[3]);
total += bill(plan, row[5]);
} else {
CappedPlan plan(row[1], row[2], row[3], row[4]);
total += bill(plan, row[5]);
}
}
return total;
}
int main() {
int n; cin >> n;
vector<vector<int>> requests(n, vector<int>(6));
for (int i = 0; i < n; ++i)
for (int j = 0; j < 6; ++j) cin >> requests[i][j];
cout << solution(requests) << '\n';
}