コーディングしなさすぎてコーディングを忘れたエンジニアがコーディングを思い出すためにコーティングします。
今回は、アメリカのコーデイング練習サイト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を使って配列をソートしているようでした。