転置してから各行を逆にし、正方形の行列を時計回りに 90 度回す

n×n の行列を、新しい行列を作らずにその場で時計回りに 90 度回します。行と列を入れ替える転置と、各行の左右の反転の 2 つに分ければ、どちらも入れ替えだけで書ける練習です。

海外で定番の問題リスト 4 本には入っていません

問題

写真の編集の道具で、正方形の画像の画素を n×n の整数の行列 matrix で持っています。この画像を時計回りに 90 度回してください。

  • 新しい行列を作らず、matrix をその場で書き換えてください。書き換えた matrix を返す関数にします
  • 回したあとの i 行 j 列には、回す前の (n - 1 - j) 行 i 列の値が来ます。左の列が下から上へ読まれて、上の行になります
  • n は 1 以上 20 以下、値はどれも -1000 以上 1000 以下です

入力と出力の例

例 1

左の列 2、8、14 を下から読んだ 14、8、2 が、いちばん上の行になります。

matrix = [[2, 4, 6], [8, 10, 12], [14, 16, 18]]
[[14, 8, 2], [16, 10, 4], [18, 12, 6]]

例 2

2×2 では、4 つの値が 1 つずつ時計回りにずれます。

matrix = [[1, 2], [3, 4]]
[[3, 1], [4, 2]]

例 3

4×4 で、負の数も入っています。

matrix = [[0, 1, 2, 3], [-1, -2, -3, -4], [5, 6, 7, 8], [9, 9, 0, 0]]
[[9, 5, -1, 0], [9, 6, -2, 1], [0, 7, -3, 2], [0, 8, -4, 3]]

面接での聞かれ方

面接では、画像の処理やゲームの盤面の話として渡されることが多いです。

  • 「正方形の行列を 90 度回してください。追加の行列は使わないでください」
  • 新しい行列に書き写す書き方を見せると、「その場でできますか?」と続きます
  • 書き終えたあとに「反時計回りなら、どこを変えますか?」と聞かれることもあります

1 つの値がどこへ動くかを式で言えるか、そして動きを簡単な操作に分けられるかが見られています。

ヒント

まだ開いていません

付箋は 3 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3答えに近い

アルゴリズムのチートシートの「配列と文字列」に、この型の要点を表とコードでまとめています。

配列と文字列の問題は、全部の組を調べると手間が大きくなる所を、窓や左右の添字で減らす形が多いです。

main.py
def rotate_matrix(matrix: list[list[int]]) -> list[list[int]]:
    """
    Goal: 何を返すか

    idea1: まず思いつく案
    -> runtime: O(?)  space: O(?)

    idea2: もっと速い案
    -> runtime: O(?)  space: O(?)

    edge case: 空、1 つだけ、など
    """
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
print(rotate_matrix([[2, 4, 6], [8, 10, 12], [14, 16, 18]]))

できているか「例で確かめる」を押すと、問題の例を全部この関数に渡して、通ったかをここに出します