문제 풀기/C#

112. 행렬 테두리 회전하기

kagan-draca 2025. 5. 12. 18:19

 

기본 틀 : 

 

using System;

public class Solution {
    public int[] solution(int rows, int columns, int[,] queries) {
        int[] answer = new int[] {};
        return answer;
    }
}

 

먼저 int형 2차원 고정 배열과 List를 만들어줬다.

 

        int[,] matrix = new int[rows, columns];
        List<int> result = new List<int>();

 

그리고 2차원 배열에 1 ~ 행 X 열 크기 만큼 숫자를 넣어줬다.

 

        for (int i = 0, count = 1; i < rows; i++) 
        {
            for (int j = 0; j < columns; j++) {
                matrix[i, j] = count++;
            }
        }

 

queries를 바로 사용하면 헷갈릴 수 있기 때문에 각각의 요소를 새로운 변수에 담아준 후

	for (int q = 0; q < queries.GetLength(0); q++) 
        {
            int x1 = queries[q, 0] - 1;
            int y1 = queries[q, 1] - 1;
            int x2 = queries[q, 2] - 1;
            int y2 = queries[q, 3] - 1;
            
            int temp = matrix[x1, y1];
            int min = temp;
        }

 

 

회전에 따른 유실될 값과 현재 최소값을 지정해준다.

 

위에서 아래, 오른쪽에서 왼쪽으로 이동을 시켜준다.

            // 위 -> 아래 이동
            for (int i = x1; i < x2; i++) 
            {
                matrix[i, y1] = matrix[i + 1, y1];
                min = Math.Min(min, matrix[i, y1]);
            }
            // 오른쪽 -> 왼쪽 이동
            for (int i = y1; i < y2; i++) 
            {
                matrix[x2, i] = matrix[x2, i + 1];
                min = Math.Min(min, matrix[x2, i]);
            }

 

아래에서 위, 왼쪽에서 오른쪽으로 이동 시켜준다.

            // 아래 -> 위 이동
            for (int i = x2; i > x1; i--) 
            {
                matrix[i, y2] = matrix[i - 1, y2];
                min = Math.Min(min, matrix[i, y2]);
            }
            // 왼쪽 -> 오른쪽 이동
            for (int i = y2; i > y1 + 1; i--) 
            {
                matrix[x1, i] = matrix[x1, i - 1];
                min = Math.Min(min, matrix[x1, i]);
            }

 

위와 같은 순서로 회전시키는 이유는

 


            matrix[x1, y1 + 1] = temp;

            result.Add(min);
        }

 

에 원래 값을 저장하여 덮여 사라지더라도 복원할 수 있기 때문이다.

 

전체 코드 : 

 

using System;
using System.Collections.Generic;

public class Solution {
    public int[] solution(int rows, int columns, int[,] queries) 
    {
        int[,] matrix = new int[rows, columns];
        List<int> result = new List<int>();
        
        for (int i = 0, count = 1; i < rows; i++) 
        {
            for (int j = 0; j < columns; j++) {
                matrix[i, j] = count++;
            }
        }

        // 각 쿼리에 대해 테두리 회전
        for (int q = 0; q < queries.GetLength(0); q++) 
        {
            int x1 = queries[q, 0] - 1;
            int y1 = queries[q, 1] - 1;
            int x2 = queries[q, 2] - 1;
            int y2 = queries[q, 3] - 1;

            int temp = matrix[x1, y1];
            int min = temp;

            // 위 -> 아래 이동
            for (int i = x1; i < x2; i++) 
            {
                matrix[i, y1] = matrix[i + 1, y1];
                min = Math.Min(min, matrix[i, y1]);
            }
            // 오른쪽 -> 왼쪽 이동
            for (int i = y1; i < y2; i++) 
            {
                matrix[x2, i] = matrix[x2, i + 1];
                min = Math.Min(min, matrix[x2, i]);
            }
            // 아래 -> 위 이동
            for (int i = x2; i > x1; i--) 
            {
                matrix[i, y2] = matrix[i - 1, y2];
                min = Math.Min(min, matrix[i, y2]);
            }
            // 왼쪽 -> 오른쪽 이동
            for (int i = y2; i > y1 + 1; i--) 
            {
                matrix[x1, i] = matrix[x1, i - 1];
                min = Math.Min(min, matrix[x1, i]);
            }

            matrix[x1, y1 + 1] = temp;

            result.Add(min);
        }

        return result.ToArray();
    }
}

 

'문제 풀기 > C#' 카테고리의 다른 글

111. 무인도 여행  (0) 2025.05.07
110. 두 큐 합 같게 만들기  (0) 2025.05.01
109. 연속된 부분 수열의 합  (0) 2025.04.28
108. 삼각 달팽  (0) 2025.04.24
107. 큰 수 만들기  (0) 2025.04.22