Pythonで予算内に購入できる車の最大台数を求める方法
問題の概要
販売中の車の価格リストと予算 k が与えられたとき、その予算内で購入できる車の最大台数を求める問題を考えます。
例えば、価格リストが [80, 20, 10, 30, 80]、予算が 85 の場合、出力は 3 になります。これは、価格 10・20・30 の3台を購入すると合計 60 となり、予算内に収まるためです。
解き方(アルゴリズム)
この問題は貪欲法(グリーディ法)を使うことで効率的に解けます。「同じ予算でできるだけ多くの車を買うなら、安い車から順に購入すればよい」というシンプルな発想です。
具体的な手順は以下の通りです。
カウンター count を 0 で初期化します
価格リスト prices を昇順にソートします
i を 0 から prices のサイズまでループさせます
prices[i] が k 以下の場合:
k から prices[i] を差し引きます
count を 1 増やします
それ以外の場合:
ループを抜けます
最後に count を返します
リストをソートしておけば、ある時点で予算を超える価格が出現した瞬間に、それ以降のすべての車も予算を超えることが保証されるため、途中でループを打ち切っても正しい答えが得られます。
実装例
以下はPythonでの実装例です。
class Solution:
def solve(self, prices, k):
count = 0
prices.sort()
for i in range(len(prices)):
if(prices[i] <= k):
k = k - prices[i]
count += 1
else:
break
return count
ob = Solution()
p = [80, 20, 10, 30, 80]
print(ob.solve(p, 85))
入力
[80, 20, 10, 30, 80], 85
出力
3
計算量の目安
ソートに O(n log n)、その後の走査に O(n) かかるため、全体の時間計算量は O(n log n) です。また、追加のデータ構造を使用しないため、空間計算量は O(1)(インプレースソートの場合)となります。リストの要素数が多くても効率よく処理できるのが特徴です。
-
【初心者向け】Pythonのissuperset()メソッドの使い方をわかりやすく解説
はじめにこの記事では、Pythonのissuperset()メソッドについて、基本的な仕組みから実際のコード例まで詳しく解説します。issuperset()は、セット(集合)に対して使用できるメソッドで、引数として渡されたセットのすべての要素が、呼び出し元のセットに含まれているかどうかを判定します。呼び出し元のセットBが、引数のセットAのすべての要素を含んでいる場合 → True を返すセットAの要素がすべてBに含まれていない場合 → False を返すつまり、「BがAの上位集合(スーパーセット)であるかどうか」を判定するためのメソッドです。基本構文B.issuperset(A)この式は、Bが
-
Pythonのアンダースコア(_)の使い方を徹底解説!シングルとダブルの違いとは
Pythonでは、状況に応じてシングルアンダースコア(_)とダブルアンダースコア(__)を使い分けます。一見すると単なる記号に見えますが、それぞれに明確な役割や慣習が存在します。 Pythonでアンダースコアが使われる主なケースは以下のとおりです。 インタプリタで最後に評価した式の値を保持したい場合 特定の値を意図的に無視したい場合 変数名や関数名の宣言において特別な意味を持たせたい場合 数値リテラルの桁区切りとして使いたい場合 国際化(i18n)や地域化(l10n)の関数として使いたい場合 それでは、それぞれのケースについて具体例を見ていきましょう。 インタプリタでの使用 Pythonの