Pythonで顧客の平均待ち時間を求めるプログラムの実装方法
レストランのキッチンをシミュレートする古典的なアルゴリズム問題を考えてみましょう。配列 customers があり、その各要素 customers[i] は [arrival_i, time_i] というペアを表しています。arrival_i は i 番目の顧客の到着時刻(昇順にソート済み)、time_i はその顧客の注文を準備するために必要な時間です。
顧客が到着すると注文を行いますが、その注文の調理はコックが手空きになったときにのみ開始されます。コックは同時に複数の顧客の料理を作ることができず、必ず注文された順番どおりに調理を行います。このとき、全顧客の平均待ち時間を求めるのがこの問題の目的です。
具体例で理解する
たとえば、入力が customers = [[7,2],[8,4],[10,3],[20,1]] の場合、出力は 3.5 になります。それぞれの顧客の流れを順番に見てみましょう。
1人目の顧客:時刻 7 に到着。コックはすぐに注文を受けて時刻 7 に調理を開始し、時刻 9 に完了します。待ち時間は 9 − 7 = 2。
2人目の顧客:時刻 8 に到着。コックは時刻 9 に調理を開始し、時刻 13 に完了します。待ち時間は 13 − 8 = 5。
3人目の顧客:時刻 10 に到着。コックは時刻 13 に調理を開始し、時刻 16 に完了します。待ち時間は 16 − 10 = 6。
4人目の顧客:時刻 20 に到着。コックは手空きなので、すぐに時刻 20 に調理を開始し、時刻 21 に完了します。待ち時間は 21 − 20 = 1。
したがって、平均待ち時間は (2 + 5 + 6 + 1) ÷ 4 = 3.5 となります。
解法のアプローチ
この問題は、コックの状態を時系列に沿ってシミュレートすることで解けます。以下の手順に従います。
- 各顧客の待ち時間を格納するための新しいリスト
arrを用意する - コックの空き時刻を表す変数
timeを 0 で初期化する customersの各ペア (i, j) について以下を繰り返す:- i > time の場合(顧客の到着時にコックが手空き):
- time := i + j
- それ以外の場合(コックが前の注文を処理中):
- time := time + j
- i > time の場合(顧客の到着時にコックが手空き):
- リスト
arrの末尾に (time − i)、つまりその顧客の待ち時間を追加する arr内の全要素の平均値を返す
アルゴリズムのポイント
変数 time は常に「コックが次の注文に取りかかれる時刻」を追跡しています。顧客が到着した時点でコックが手空きなら調理は到着時刻から始まり、そうでなければ前の注文の完了時刻から始まります。各顧客の待ち時間は「注文完了時刻 − 到着時刻」で計算できるため、これをすべて合計して人数で割れば平均待ち時間が求められます。計算量は O(n) と非常に効率的です。
実装例
以下がPythonでの実装例です。
def solve(customers):
arr = []
time = 0
for i , j in customers:
if(i > time):
time = i + j
else:
time += j
arr.append(time - i)
return sum(arr) / len(arr)
customers = [[7,2],[8,4],[10,3],[20,1]]
print(solve(customers))
入力
[[7,2],[8,4],[10,3],[20,1]]
出力
3.5
-
Pythonでポリゴンの面積を求める方法:靴ひも公式を使った実装
はじめに2次元平面上に、単純な多角形(ポリゴン)の頂点を時計回りまたは反時計回りの順に並べた座標リストが与えられたとします。このとき、その多角形の面積を計算するのが本記事の目的です。例えば、入力が points = [(0, 0), (0, 5), (3, 5), (3, 0)] のような場合、これは幅3・高さ5の長方形を表しているため、出力は 15.0 となります。解法の考え方:靴ひも公式(Shoelace Formula)この問題は、有名な靴ひも公式(測量士の公式)を使うことで効率的に解けます。隣り合う2頂点ごとに外積 x1*y2 - y1*x2 を計算し、それらをすべて足し合わせて絶対値
-
Pythonで多角形の外周(周囲長)を求めるプログラム
問題の概要2次元平面上にある単純な多角形(自己交差しないポリゴン)の頂点が、順序付きの点のリストとして与えられているとします。このとき、その多角形の外周(周囲長)を求めることが目的です。例として、入力が points = [(0, 0), (0,5), (3, 5), (3,0)] の場合を考えてみましょう。このときの出力は 16 になります。これは、図からも分かるように、長さ3の辺が2本、長さ5の辺が2本存在するためです。したがって、2×5 + 2×3 = 16 となります。アルゴリズムの考え方この問題は、「隣接する2つの頂点間の距離をすべて計算して合計する」というシンプルなアプローチで解く