LoginSignup
0
0

More than 1 year has passed since last update.

CodeSignal - rotateImageにチャレンジ

Last updated at Posted at 2021-08-04

コーディングしなさすぎてコーディングを忘れたエンジニアがコーディングを思い出すためにコーティングします。
今回は、アメリカのコーデイング練習サイトCodeSignalの問題「rotateImage」を解いていきます。
サイトによると、この問題はAmazon、Microsoft、Appleの面接で出されたことがあるようです。

問題

画像を表したn×nの2Dの行列が配列として与えられるので、それを時計回りに90度回転して出力する関数を書きます。
たとえば以下であれば、

a = [[1, 2, 3],
     [4, 5, 6],
     [7, 8, 9]]

出力はこうなります。

rotateImage(a) =
    [[7, 4, 1],
     [8, 5, 2],
     [9, 6, 3]]

制約:
1 ≤ a.length ≤ 100
⇨配列の長さは1以上100以下
a[i].length = a.length
⇨画像の縦横の要素数は同じ
1 ≤ a[i][j] ≤ 10^4
⇨配列の中の値は1以上10000以下

解説・考え方

とりあえず上のサンプルを見てみると、90度回転後は、
・1が上段右に移動
・2が中段右に移動
・3が下段右に移動
・4が上段中に移動
・・・
というように順番に並べ替えれば解けることに気づきます。
そこで、ループを2つ回して回転前の配列から順番に値を取り出し、もう一つ作った同じ要素数の2次元配列に順番を入れ替えてセットしていくことにしました。

Javaで書くとこんな感じです。

int[][] rotateImage(int[][] a) {
    int arraySize = a.length;
    int[][] answer = new int[arraySize][arraySize]; 
    for(int i=0; i<arraySize; i++){
        for(int j=0; j<arraySize; j++){
            // answer[0][2] = a[0][0]
            // answer[1][2] = a[0][1]
            // answer[2][2] = a[0][2]
            // answer[0][1] = a[1][0]
            // answer[1][1] = a[1][1]
            // and so on
            answer[j][arraySize - 1 - i] = a[i][j];

        }
    }
    return answer;
}

コードの説明
まず答え用にanswerという、お題と同じ要素数の2次元配列を用意しています。
その後、2つのループで2次元配列の値を先頭からチェックしています。
ループの中で回転前の値を、answerの然るべき位置に一つづつセットしています。

感想

単純なアプローチしか思いつかず、またも他の回答者のコードに圧倒されることとなりました。

他の回答者をみると、PythonやJavascriptでたった1行で書けているものがありました。
あまり読み解けてないのですが、reverseやlambdaを使って配列をソートしているようでした。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0