【AtCoder】PythonでABC237のB問題を丁寧に読み解く

AtCoder Beginner Contest 237 - Matrix Transposition

実際の問題はこちらからご覧ください。

【AtCoder Beginner Contest 237】B – Matrix Transposition

この問題のポイント

行列の転置とは何か数学的に理解していること、それをPythonのzip()関数を応用して実装できる

行列の転置とは

行列の転置とは、元の行列の行と列を入れ替える操作のこと。具体的には、元の行列Aの上からi行目、左からj列目の要素が、転置後の行列Bの上からj行目、左からi列目の要素となる。この操作により、行列の形状が変わることがある。

Pythonのzip関数を使うことで、この操作を簡潔に実装できる。Pythonにおけるzip関数は、複数のイテラブル(例えばリストやタプルなど)から要素を集め、新たなイテレータを作成するために使用される。*演算子(アンパック演算子)を併用することで、リストのリスト(2次元リスト)を転置するのに非常に便利。

実装方法

1. 入力の取得: ints関数を定義し、スペース区切りの整数の入力をリストとして受け取ります。これを使って、行数hと列数w、および行列aの各行を入力から取得します。

2. 行列の転置: zip(a)を使って行列aの転置を行います。ここで、aは*演算子(アンパック演算子)を併用することで行列aの各行をzip関数に個別の引数として渡します。zip関数はそれらの引数から同じ位置にある要素をタプルとしてまとめ、これらのタプルから成るイテレータを返します。結果として、行列aの転置が得られます。

3. 結果の出力: 転置した行列bの各行をループで回しながら、print(*row)を使って各要素をスペース区切りで出力します。

Pythonによる解答

このアルゴリズムの計算量は、O(HW) ※ “H”:行数、”W”:列数

def ints():
  return list(map(int, input().split()))

h,w = ints()
a = [ints() for i in range(h)]
b = zip(*a)
for row in b:
  print(*row)