Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#으로 n×n 행렬을 90도 회전하는 방법

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)로, 메모리 효율이 중요한 환경에서 유용하게 활용할 수 있습니다.