問題
給与計算システムでは、すべての従業員は Employee として扱われ、WeeklyPay() メソッドを持ち、それぞれの種類の従業員がこれをオーバーライドします。
各従業員は次のように表されます:
salaried <annual>: annual / 52 を稼ぎます。hourly <rate> <hours>: 最初の 40 時間は rate × hours、40 時間を超えた分は 1.5 × rate を1時間ごとに稼ぎます。commission <base> <rate> <sales>: base + rate × sales を稼ぎます。
weekly_payroll(employees) を実装してください。
入力
employees: 従業員たちです。数値には小数が含まれる場合があります。
出力
週次給与の合計を返してください。1e-6 以内の誤差は正解とみなされます。
制約
0 ≤ 従業員の数 ≤ 10,000
すべての数は 0 以上 10^7 以下; hours ≤ 100
例
例 1
入力:
employees = ["salaried 52000", "hourly 20 45"]
期待される出力:
expected = 1950.0
入力:
std::vector<std::string> employees = {"salaried 52000", "hourly 20 45"};
期待される出力:
double expected = 1950.0;
入力:
string[] employees = new string[] {"salaried 52000", "hourly 20 45"};
期待される出力:
double expected = 1950.0;
解説
給与制の従業員は 52000 / 52 = 1000 を稼ぎます。時給制の従業員は 20 × 40 + 30 × 5 = 950 を稼ぎます。合計は 1950 です。
例 2
入力:
employees = ["commission 300 0.1 2500"]
期待される出力:
expected = 550.0
入力:
std::vector<std::string> employees = {"commission 300 0.1 2500"};
期待される出力:
double expected = 550.0;
入力:
string[] employees = new string[] {"commission 300 0.1 2500"};
期待される出力:
double expected = 550.0;
解説
300 + 0.1 × 2500 = 550。
解き方のヒント
まずは自分で考えてから、ヒントを 1 つずつ開いてみましょう。
ヒント 1
従業員の種類ごとに専用の公式を使います。
ヒント 2
時給制は最初の 40 時間が通常、その後は 1.5 倍です。
ヒント 3
小数を保ちましょう。年俸を 52 で割ると整数になることはまれです。
目安の計算量
時間 O(従業員の数)、追加メモリ O(1)
参考資料
この課題はCodeUtility用に調整されています。上記の説明と制約に従ってください。