Javaで行列の要素を1つずつ回転させるプログラムの作成方法
本記事では、行列(マトリックス)の要素を回転させる方法を、Javaのサンプルコードとともにわかりやすく解説します。行列とは、要素を行と列の形式で表現したデータ構造のことです。行列の回転とは、行列内の各要素の位置を右方向(または左方向)へ1つずつシフトする操作を指します。
入力と出力のイメージ
まず、具体的な処理内容を例で確認しましょう。
入力(元の行列):
The matrix is defined as 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
出力(1回回転後の行列):
The matrix after one rotation: 5 1 2 3 9 10 6 4 13 11 7 8 14 15 16 12
ご覧のとおり、各行・各列の要素が時計回りに1つずつ移動しています。この処理は、行列を「リング状の層(外周→内周)」に分け、各層の要素を順番にシフトしていくことで実現できます。
アルゴリズム
回転処理は、以下の手順で実装します。
ステップ1 - 処理開始 ステップ2 - 整数型の行列 input_matrix を宣言し、row(行)、column(列)、previous(前の値)、current(現在の値)の変数を用意する ステップ3 - 行列の値を定義する ステップ4 - whileループで行列の各層を外側から走査し、複数のforループを組み合わせて各要素を1つ右へシフトしながら保存する ステップ5 - 結果を表示する ステップ6 - 処理終了
例1:mainメソッド内で完結させるパターン
この例では、行列の定義から回転処理、結果の表示までの一連の流れを、すべて main メソッド内に直接記述しています。
public class RotateMatrix {
static int Rows = 4;
static int Columns = 4;
public static void main(String[] args) {
int input_matrix[][] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}
};
System.out.println("The input_matrix is defined as ");
for (int i = 0; i < Rows; i++) {
for (int j = 0; j < Columns; j++)
System.out.print( input_matrix[i][j] + " ");
System.out.print("\n");
}
int m = Rows, n = Columns;
int row = 0, column = 0;
int previous, current;
while (row < m && column < n) {
if (row + 1 == m || column + 1 == n)
break;
previous = input_matrix[row + 1][column];
for (int i = column; i < n; i++) {
current = input_matrix[row][i];
input_matrix[row][i] = previous;
previous = current;
}
row++;
for (int i = row; i < m; i++) {
current = input_matrix[i][n-1];
input_matrix[i][n-1] = previous;
previous = current;
}
n--;
if (row < m) {
for (int i = n-1; i >= column; i--) {
current = input_matrix[m-1][i];
input_matrix[m-1][i] = previous;
previous = current;
}
}
m--;
if (column < n) {
for (int i = m-1; i >= row; i--) {
current = input_matrix[i][column];
input_matrix[i][column] = previous;
previous = current;
}
}
column++;
}
System.out.println("\nThe input_matrix after one rotation: ");
for (int i = 0; i < Rows; i++) {
for (int j = 0; j < Columns; j++)
System.out.print( input_matrix[i][j] + " ");
System.out.print("\n");
}
}
}
実行結果
The input_matrix is defined as 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 The input_matrix after one rotation: 5 1 2 3 9 10 6 4 13 11 7 8 14 15 16 12
例2:回転処理をメソッド化したパターン
こちらの例では、回転ロジックを Rotate_matrix という独立したメソッドに切り出しています。あらかじめ定義された行列を受け取り、回転後の結果をコンソールに出力します。処理を部品化することで、コードの再利用性と可読性が向上します。
public class RotateMatrix {
static int Rows = 4;
static int Columns = 4;
static void Rotate_matrix(int m,
int n, int matrix[][]) {
int row = 0, column = 0;
int previous, current;
while (row < m && column < n) {
if (row + 1 == m || column + 1 == n)
break;
previous = matrix[row + 1][column];
for (int i = column; i < n; i++) {
current = matrix[row][i];
matrix[row][i] = previous;
previous = current;
}
row++;
for (int i = row; i < m; i++) {
current = matrix[i][n-1];
matrix[i][n-1] = previous;
previous = current;
}
n--;
if (row < m) {
for (int i = n-1; i >= column; i--) {
current = matrix[m-1][i];
matrix[m-1][i] = previous;
previous = current;
}
}
m--;
if (column < n) {
for (int i = m-1; i >= row; i--) {
current = matrix[i][column];
matrix[i][column] = previous;
previous = current;
}
}
column++;
}
System.out.println("\nThe matrix after one rotation: ");
for (int i = 0; i < Rows; i++) {
for (int j = 0; j < Columns; j++)
System.out.print( matrix[i][j] + " ");
System.out.print("\n");
}
}
public static void main(String[] args) {
int input_matrix[][] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}
};
System.out.println("The matrix is defined as ");
for (int i = 0; i < Rows; i++) {
for (int j = 0; j < Columns; j++)
System.out.print( input_matrix[i][j] + " ");
System.out.print("\n");
}
Rotate_matrix(Rows, Columns, input_matrix);
}
}
実行結果
The matrix is defined as 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 The matrix after one rotation: 5 1 2 3 9 10 6 4 13 11 7 8 14 15 16 12
まとめ
行列の回転は、外周から順に「上辺→右辺→下辺→左辺」の要素を循環的に入れ替えることで実現できます。実装のポイントは以下のとおりです。
- whileループで行列のリング(層)を外側から内側へ縮小しながら処理する
- previous / current の2つの変数を使い、要素の値を失わないように受け渡す
- 境界条件(row + 1 == m など)の判定により、1行・1列のみのケースを安全にスキップする
この手法は時間計算量 O(m×n)、追加の記憶領域は O(1) で済むため、サイズの大きい行列でも効率的に動作します。ぜひ実際にコードを動かして、挙動を確認してみてください。
-
Javaで実装する反復クイックソート(非再帰)プログラムの解説
クイックソートは通常、再帰呼び出しによって実装されますが、再帰を使わずに明示的なスタックを利用することでも実装できます。これを「反復クイックソート(Iterative Quick Sort)」と呼びます。以下は、そのJavaによる実装例です。 サンプルコード public class Demo{ void swap_vals(int arr[], int i, int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } int partition(int arr
-
【Java入門】配列を左に回転させるプログラムの書き方と仕組みを解説
配列ローテーションとは配列のローテーション(回転)とは、配列内の要素を指定した位置数だけ前後にずらす操作のことです。本記事では、Javaを使って配列を左方向へ回転させるプログラムを紹介し、その仕組みをわかりやすく解説します。サンプルコード以下は、配列を左に回転させるJavaプログラムの完全なコード例です。public class Demo{ void rotate_left(int my_arr[], int d, int len){ d = d % len; int i, j, k,