n×n 크기의 정사각형 행렬을 90도 회전하는 것은 코딩 테스트와 실무에서 자주 만나게 되는 대표적인 배열 조작 문제입니다. 이 글에서는 별도의 추가 배열 없이 제자리(in-place)에서 행렬을 반시계 방향으로 90도 회전시키는 C# 구현 방법을 소개합니다.
알고리즘의 핵심 원리
n×n 행렬은 총 n/2개의 동심원 형태의 사각형 레이어로 나눌 수 있습니다. 중첩 루프(nested loop)를 사용해 바깥쪽 레이어부터 안쪽 레이어까지 하나씩 처리하며, 각 레이어 안에서는 4개의 요소가 하나의 순환(cycle)을 이루며 이동합니다. 따라서 매 순환마다 해당하는 4개의 요소를 반시계 방향으로 서로 교환해 주면 됩니다.
각 순환에서 요소는 다음 규칙에 따라 이동합니다.
- 위치 (n-1-j, i)에 있는 요소는 위치 (i, j)로 이동합니다.
- 위치 (i, j)에 있는 요소는 위치 (j, n-1-i)로 이동합니다.
- 위치 (j, n-1-i)에 있는 요소는 위치 (n-1-i, n-1-j)로 이동합니다.
- 위치 (n-1-i, n-1-j)에 있는 요소는 위치 (n-1-j, i)로 이동합니다.
C# 구현 예제
using System;
using System.Text;
namespace ConsoleApplication{
public class Matrix{
public void RotateMatrixBy90Degree(int[] matrix){
int n = matrix.GetLength(0);
for (int i = 0; i < n / 2; i++){
for (int j = i; j < n - i - 1; j++){
int top = matrix[i, j];
// 왼쪽 요소를 위쪽으로 이동
matrix[i, j] = matrix[n - 1 - j, i];
// 아래쪽 요소를 왼쪽으로 이동
matrix[n - 1 - j, i] = matrix[n - i - 1, n - 1 - j];
// 오른쪽 요소를 아래쪽으로 이동
matrix[n - i - 1, n - 1 - j] = matrix[j, n - i - 1];
// 위쪽 요소를 오른쪽으로 이동
matrix[j, n - i - 1] = top;
}
}
for (int i = 0; i < n; i++){
StringBuilder s = new StringBuilder();
for (int j = 0; j < n; j++){
s.Append(matrix[i, j] + " ");
}
Console.WriteLine(s);
s = null;
}
}
}
class Program{
static void Main(string[] args){
Matrix m = new Matrix();
int[] matrix = { { 5, 1, 9, 11 }, { 2, 4, 8, 10 }, { 13, 3, 6, 7 }, { 15, 14, 12, 16 } };
m.RotateMatrixBy90Degree(matrix);
}
}
}
실행 결과
15 13 2 5
14 3 4 1
12 6 8 9
16 7 10 11
마무리
이 알고리즘은 바깥 레이어부터 안쪽으로 진행하면서 매 단계마다 4개의 요소만 교환하기 때문에 시간 복잡도는 O(n²)입니다. 또한 임시 배열 없이 입력 행렬의 값을 그대로 덮어쓰는 방식이므로 공간 복잡도 역시 O(1)로, 메모리 효율이 중요한 환경에서 유용하게 활용할 수 있습니다.