Pythonで長方形から作れる最大の正方形の個数を求めるプログラム
長さと幅のペアで構成される配列 rect があるとします。rect[i] は [len_i, wid_i] という2つの要素を持ち、それぞれ i 番目の長方形の長さと幅を表しています。
k <= len_i かつ k <= wid_i を満たす場合、i 番目の長方形を切り取って一辺が k の正方形を作ることができます。例えば、[4,6] という長方形であれば、切り出せる正方形の一辺は最大で 4 です。
ここで、与えられたすべての長方形の中から作れる最大の正方形の一辺の長さを maxLen とします。このとき、一辺が maxLen の正方形を作れる長方形の個数を求めるのがこの問題です。
問題の例
入力が rect = [[6,9],[4,10],[6,13],[17,6]] の場合、出力は 3 になります。各長方形から切り出せる最大の正方形の一辺は [6, 4, 6, 6] となり、最大値である 6 を持つ長方形が 3 つ存在するためです。
解法のアプローチ
長方形から作れる正方形の一辺は、必ず短い方の辺によって制限されます。したがって、各長方形について「短い方の辺の長さ」を求めれば、それがその長方形から作れる最大の正方形の一辺となります。あとは、その中での最大値と一致する要素の個数を数えるだけで答えが得られます。
具体的な手順は以下の通りです。
- 結果を格納するための空のリスト
mを作成する rect内の各長方形rについて、min(r)(短い方の辺)をmの末尾に追加するmの中にmax(m)(最大値)が出現する回数を数えて返す
Pythonでの実装例
以下のコードで実際の動作を確認してみましょう。
def solve(rect):
m = []
for r in rect:
m.append(min(r))
return m.count(max(m))
rect = [[6,9],[4,10],[6,13],[17,6]]
print(solve(rect))入力
[[6,9],[4,10],[6,13],[17,6]]
出力
3
計算量について
この解法では、すべての長方形を一度走査して最小値を求める処理に O(n)、最大値の出現回数を数える処理にも O(n) かかるため、全体の時間計算量は O(n) となります。補助リストとして O(n) の空間を使用します。非常にシンプルでありながら効率的なアプローチだと言えます。
-
Pythonで配列内の最大の要素を見つける方法を解説
この記事では、「配列の中から最大の要素を求める」という問題の解決方法について詳しく解説します。 問題の概要 問題文:与えられた配列に対して、その中で最も大きい要素を計算して求める必要があります。 ここではブルートフォース(総当たり)アプローチを使用します。これは、配列全体を先頭から順番に走査しながら各要素を比較し、その時点での最大値を更新していくというシンプルかつ確実な手法です。 実装例 以下に具体的なコードを示します。 # 最大値を求める関数 def largest(arr, n): # 最大要素の初期値として最初の要素を設定 max = arr[0] # 配列全体を
-
【Python】ある数の最大の素因数を求めるプログラムの書き方
この記事では、「与えられた整数の最大の素因数を求める」という問題に対する解決方法を、具体的なコード例とともにわかりやすく解説します。 問題文 正の整数 n が与えられたとき、その数の最大の素因数を求めます。 例えば n = 15 の場合、15 は 3 × 5 と素因数分解できるため、答えは 5 となります。 解き方のアプローチ 入力された数を、小さい約数から順番に割っていくことで素因数分解します。 割り切れるたびに、その時点での約数(素因数)を「最大値」として更新していきます。 平方根まで調べれば十分なため、計算量を抑えられます。 実装例(サンプルコード) import math def