Pythonでシャッフルされたキューを元の順序に復元するプログラム
問題の概要
ここに2次元のマトリックス(リスト)があります。各行は [height, count] という2つの値を持っており、height はその人の身長、count は「その人の前方にいる、身長が自分と同じかそれ以上の人の数」を表します。このキューがシャッフルされてしまったとき、元の並び順を復元するのが今回の課題です。
たとえば、入力が次のような場合を考えてみましょう。
| 2 | 2 |
| 4 | 0 |
| 5 | 0 |
このとき、期待される出力は次のとおりです。
| 4 | 0 |
| 5 | 0 |
| 2 | 2 |
結果を見ると、身長4と5の人は前方に自分以上の背の人がいないため先頭側に配置され、身長2の人の前には身長4と5の2人が立っているため、3番目に配置されていることがわかります。
解決のための手順
この問題は、次の手順で解くことができます。
- N := マトリックスの行数を取得します。
- マトリックスの行を「身長の昇順・カウントの降順」で並べ替えます。
- ans := サイズNのリストを作成し、すべての要素を None(空)で初期化します。
- マトリックスの各行から身長 h とカウント c を取り出し、以下の処理を行います。
- temp := 0 とします。
- ans の各インデックス i と値 num について、次を繰り返します。
- temp >= c かつ num が None の場合:ans[i] := [h, c] を設定し、ループを抜けます。
- num が None または num[0] >= h の場合:temp := temp + 1 とします。
- 最後に ans を返します。
このアルゴリズムのポイントは、身長の昇順に並べ替えて背の低い人から順に確定させていく点です。すでに配置済みの人と、自分と同じ以上の身長の人だけをカウントすることで、各人が入るべき正しい位置を求められます。
実装例
理解を深めるために、以下の実装を見てみましょう。
class Solution:
def solve(self, matrix):
N = len(matrix)
matrix.sort(key=lambda x: [x[0], -x[1]])
ans = [None] * N
for h, c in matrix:
temp = 0
for i, num in enumerate(ans):
if temp >= c and num is None:
ans[i] = [h, c]
break
if num is None or num[0] >= h:
temp += 1
return ans
ob = Solution()
matrix = [
[2, 2],
[4, 0],
[5, 0]
]
print(ob.solve(matrix))
入力
[[2, 2],[4, 0],[5, 0]]
出力
[[4, 0], [5, 0], [2, 2]]
-
Pythonでグラフの頂点間の到達可能性行列を計算するプログラム
隣接リスト形式で表現されたグラフが与えられたとき、次のような条件を満たす2次元行列Mを求めることを考えます。M[i, j] = 1:頂点iから頂点jへの経路(パス)が存在する場合M[i, j] = 0:経路が存在しない場合例えば、次のようなグラフが入力として与えられたとします。この場合の出力は、以下の5×5の行列になります。1111101111011110111101111解法のアプローチこの問題は、各頂点を起点とした幅優先探索(BFS)を用いることで効率的に解くことができます。具体的な手順は以下の通りです。n×nの2次元行列「ans」を作成し、すべての要素を0で初期化します(nは頂点の総数)
-
Pythonで行列の転置を求めるプログラム
この記事では、与えられた問題に対する解法とアプローチについて詳しく解説します。 問題文 ある行列が与えられたとき、その転置を同じ行列に格納し、結果を表示する必要があります。 行列の転置とは、行を列に、列を行に入れ替えたものです。言い換えれば、行列Aの転置は、要素A[i][j]をA[j][i]と入れ替えることで得られます。 実装例 N = 4 def transpose(A): for i in range(N): for j in range(i+1, N): A[i][j], A[j][i] = A[j][i], A[i][j] # ドライ