Pythonで指定された3つの頂点から長方形の4番目の頂点の座標を求める方法
Q × P のサイズのグリッドを考えてみましょう。このグリッドには、ちょうど3つのアスタリスク「*」が含まれており、その他のセルはすべてドット「.」で埋められています。「*」は長方形の頂点を表しています。ここでの課題は、欠けている4番目の頂点の座標を見つけることです。なお、座標は1始まりのインデックス(1-based indexing)として扱います。
たとえば、入力が grid = ["*..", "...", "*.*"] の場合、出力は (1, 3) になります。これが求める、欠けている頂点の座標です。
アプローチ:行と列の出現回数を数える
この問題は、各行・各列に含まれる「*」の個数に着目することで効率的に解けます。グリッドに沿って配置された長方形の頂点は、必ず2つの行と2つの列にまたがって存在します。3つの頂点がすでに分かっている状態では、「*」が1個だけ含まれる行と列がそれぞれ1つずつ存在し、その交点こそが欠けている4番目の頂点に該当します。
具体的には、次の手順で解きます。
- p := グリッドの行数、q := グリッドの列数とします。
- 行番号をキー、出現回数を値とするマップ row を作成し、すべての値を 0 で初期化します。
- 同様に、列番号をキーとするマップ col を作成します。
- i を 0 から p−1 まで、j を 0 から q−1 までの二重ループでグリッドを走査し、grid[i][j] が「*」であれば row[i] と col[j] をそれぞれ +1 します。
- row の中で値が 1 になっている行番号を x_coord とします。
- col の中で値が 1 になっている列番号を y_coord とします。
- (x_coord + 1, y_coord + 1) を返します(+1 は1始まりのインデックスへの変換です)。
Pythonによる実装例
理解を深めるために、実際の実装を見てみましょう。
def get_missing_vertex(grid) :
p = len(grid)
q = len(grid[0])
row = dict.fromkeys(range(p), 0)
col = dict.fromkeys(range(q), 0)
for i in range(p) :
for j in range(q) :
if (grid[i][j] == '*') :
row[i] += 1
col[j] += 1
for k,v in row.items() :
if (v == 1) :
x_coord = k
for k,v in col.items() :
if (v == 1) :
y_coord = k
return (x_coord + 1, y_coord + 1)
grid = ["*..", "...", "*.*"]
print(get_missing_vertex(grid))
入力
["*..", "...", "*.*"]
出力
(1, 3)
動作の解説
この入力の場合、アスタリスクは0始まりの座標で (0, 0)、(2, 0)、(2, 2) の位置にあります。行ごとに数えると、行0に1個、行2に2個の「*」があるため、x_coord は 0 となります。同様に列ごとに数えると、列2だけが1個であるため、y_coord は 2 となります。最後に1始まりの座標へ変換し、(1, 3) が出力される仕組みです。
計算量: グリッド全体を一度だけ走査するため、時間計算量は O(p × q)。行・列ごとのカウント用マップが必要になるため、空間計算量は O(p + q) となります。非常にシンプルながら、グリッドサイズが大きくなっても安定した性能を発揮できる手法です。
-
Pythonで配列から1つの要素を削除して「良い配列」になるインデックスをすべて見つける方法
問題の概要 数値の配列 A が与えられたとき、i 番目の要素を削除した後に「良い配列(good array)」となるような、すべてのインデックスを見つける必要があります。ここでの条件は以下の通りです。 良い配列とは、配列内のある要素が、それ以外のすべての要素の合計と等しい配列のことです。 インデックスは 1 始まり(1-based)で表します。 たとえば、入力が [10, 4, 6, 2] の場合、出力は [1, 4] になります。 A[1](=10)を削除すると、配列は [4, 6, 2] となり、6 = 4 + 2 が成立するため良い配列です。 A[4](=2)を削除すると、配列は
-
Pythonでネストされたリストから最大値を持つサブリストを検索する方法
Pythonでは、リストの要素として別のリスト(サブリスト)を持つことができます。本記事では、指定されたリストの中に含まれる複数のサブリストから、最大値を持つサブリストを見つける方法を2つのアプローチで解説します。 方法1: max関数とlambda式を組み合わせる 最もシンプルな方法は、max()関数とlambda式を組み合わせることです。lambda式でサブリスト内の比較対象となる要素(この例ではインデックス1の数値)を指定することで、その値が最大であるサブリストを取得できます。 コード例 listA = [[Mon, 90], [Tue, 32], [Wed, 120]] # lambd