JavaでN×Nの正方行列を反時計回りに90度回転させる方法
N×N の正方行列が与えられたとき、その行列を反時計回りに90度回転させることを考えます。まずは具体的な例を見てみましょう。
入力例:
N = 3
matrix[ ][ ] = [
[1 2 3],
[4 5 6],
[7 8 9]
]出力例:
3 6 9 2 5 8 1 4 7
解説: 与えられた行列を反時計回りに90度回転させると、各行・各列の位置関係が変化し、出力は「3 6 9 2 5 8 1 4 7」となります。
この問題へのアプローチ
基本的な発想は、まず与えられた行列の転置行列を求め、その後に行ごとに要素を入れ替えるというものです。手順は以下の通りです。
正方行列を入力として受け取る。
行列の転置(行と列を入れ替えたもの)を求める。
インデックス 0 の要素とインデックス n-1 の要素を入れ替える。
結果を出力して返す。
実装例
以下は、上記のアプローチを Java で実装したサンプルコードです。
import java.io.*;
class Solution {
static void rotateMatrix(
int n, int matrix[][]){
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
int temp= matrix[i][j];
matrix[i][j]= matrix[j][i];
matrix[j][i]= temp;
}
}
for(int i=0;i<n;i++){
int top=0;
int bottom = n-1;
while(top<bottom){
int temp = matrix[top][i];
matrix[top][i]=matrix[bottom][i];
matrix[bottom][i] = temp;
top++;
bottom--;
}
}
}
static void displayMatrix(int N, int mat[][]){
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++)
System.out.print(" " + mat[i][j]);
System.out.print("\n");
}
System.out.print("\n");
}
public static void main(String[] args){
int N = 3;
int mat[][] = {
{1,2,3},
{4,5,6},
{7,8,9}
};
rotateMatrix(N, mat);
displayMatrix(N, mat);
}
}出力結果
上記のコードを実行すると、以下の出力が得られます。
3 6 9 2 5 8 1 4 7
-
Javaで実装するカクテルソート(双方向バブルソート)のプログラム
カクテルソート(Cocktail Sort)は、バブルソートを改良した整列アルゴリズムの一つで、「双方向バブルソート」や「シェーカーソート」とも呼ばれます。通常のバブルソートが配列を一方向にのみ走査するのに対し、カクテルソートは前方向と後方向を交互に走査する点が最大の特徴です。まず前方向のパスでは、隣り合う要素を比較しながら大きい値を配列の末尾側へ移動させます。続く後方向のパスでは、逆に小さい値を配列の先頭側へ移動させます。この往復操作を、交換が一度も発生しなくなるまで繰り返すことで、配列全体が昇順に整列されます。この手法により、配列の終盤に位置する小さな要素でも、1回の後方向パスで先頭付近ま
-
Pythonで正方行列を反時計回りに90度回転させる方法
正方行列が与えられたとき、それを反時計回りに90度回転させることを考えてみましょう。例として、次のような3×3の行列があるとします。147258369これを反時計回りに90度回転させると、出力は次のようになります。789456123解決のための手順この問題は、「各行の反転」と「転置(行と列の入れ替え)」という2つの基本的な操作を組み合わせることで解くことができます。具体的な手順は以下の通りです。行列が空である場合は、空のリストを返しますn := 行列の行数とします行列の各行に対して、その行を反転(リバース)しますi を 0 から n-1 まで繰り返します:j を 0 から i-1 まで繰り返し