기본 틀 :
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 |