Pythonで所持コインで買えるアイスクリームの最大数を求めるプログラム
本記事では、Pythonを使って「所持しているコインで最大いくつのアイスクリームを買えるか」を求めるアルゴリズムを解説します。
問題の概要
n個の要素を持つ配列 costs が与えられます。costs[i] は i 番目のアイスクリームの価格(コイン単位)を表します。最初に c 枚のコインを持っており、できるだけ多くのアイスクリームを購入したいと考えます。このとき、c 枚のコインで買えるアイスクリームの最大数を求めるのが目的です。
たとえば、入力が costs = [3,1,4,5,2]、c = 10 の場合、出力は 4 になります。これは、インデックス 0、1、2、4 のアイスクリームを合計 3 + 1 + 4 + 2 = 10 コインで購入できるためです。
解き方のアプローチ
この問題は貪欲法(グリーディ法)で効率的に解けます。安いアイスクリームから順に買っていけば、同じ予算で最大数を達成できるためです。手順は以下の通りです。
- 配列
costsを昇順にソートする - カウンタ変数
i := 0を初期化する iが配列の長さ未満 かつ 残りのコインcがcosts[i]以上である間、以下を繰り返すc := c - costs[i](コインを支払う)i := i + 1(購入数を増やす)
- ループ終了後の
iを返す(これが購入できた最大数)
実装例
それでは、実際のPythonコードを見てみましょう。
def solve(costs, c):
costs.sort()
i = 0
while(i < len(costs) and c >= costs[i]):
c = c - costs[i]
i = i + 1
return i
costs = [3,1,4,5,2]
c = 10
print(solve(costs, c))入力
[3,1,4,5,2], 10
出力
4
計算量について
このアルゴリズムの計算量は、ソートに O(n log n)、その後の走査に O(n) かかるため、全体として O(n log n) となります。ソートによって安価な商品から順に確認できるため、貪欲な選択が常に最適解につながる点がポイントです。
-
Pythonで数値の任意の位置に5を挿入して最大値を求める方法
整数 n が与えられたとき、数字「5」を任意の位置に1つ挿入することで得られる最大の数を求める問題を考えてみましょう。例えば、n = 834 の場合、出力は 8534 になります。これは「8」と「3」の間に「5」を挿入した結果です。解法のアプローチこの問題を解くためには、以下の手順に従います。n が正の数の場合:s := n を文字列に変換k := 空の文字列c := False(挿入済みフラグ)s の各文字 i について繰り返し処理を行う:i が「5」未満かつ c が False の場合:k := k + 5 + ic := Trueそれ以外の場合:k := k + ik を整数として返すn
-
Pythonで制約付きの建物の最大高さを求めるプログラム
問題の概要整数 n と制約リスト restrictions が与えられたとします。私たちは都市に n 棟の新しい建物を一列に建てようとしていますが、高さに関するいくつかの制限があります。建物には左から順に 1 から n までの番号が付けられており、各制約は restrictions[i] = (id_i, max_height_i) の形式で表され、「id_i 番の建物の高さは max_height_i 以下でなければならない」ことを意味します。建物の高さに関する都市の規則は以下のとおりです。各建物の高さは 0 以上でなければなりません。1 番の建物(最初の建物)の高さは必ず 0 です。隣接す