中級 0件解決済み 正答率0%

週給の計算

それぞれ独自のルールで支払われる、給与制・時給制・歩合制の従業員の1週間分の給与合計を求めます。

このチャレンジで学べること

  • 従業員の種類ごとのルールで給与を計算する
  • 40 時間を超えた分に残業代を払う
  • 小数の金額を正確に合計する

問題

原文(英語)を表示

給与計算システムでは、すべての従業員は 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用に調整されています。上記の説明と制約に従ってください。

他の人の解答から学ぶ

コミュニティの解答

まだ公開された解答がありません。この課題を解いて最初の解答を共有しましょう。