안녕하세요. 오늘은 행렬 테두리 회전하기 문제를 풀어보겠습니다. 이 문제는 2021 Dev-Matching: 웹 백엔드 개발자(상반기) 에서 출제되었습니다.
https://programmers.co.kr/learn/courses/30/lessons/77485
위 그림은 rotate함수에 있는 4개의 for문이 돌아가는 순서입니다. 초기 숫자인 "8"을 tmp 변수에 넣고, 14를 8이 있었던 자리에 넣는 것부터 시작합니다. 마지막에는 9가 있었던 자리에 8을 넣고 rotate함수는 종료됩니다.
class Solution {
private int[][] matrix;
public int[] solution(int rows, int columns, int[][] queries) {
matrix = new int[rows][columns];
int[] answer = new int[queries.length];
int num = 1;
// matrix 행렬 초기화
for(int i = 0; i < rows; i++){
for(int j = 0; j < columns; j++){
matrix[i][j] = num;
num++;
}
}
for(int i = 0; i < queries.length; i++){
answer[i] = rotate(queries[i]);
}
return answer;
}
private int rotate(int[] query){
int r1 = query[0]-1;
int c1 = query[1]-1;
int r2 = query[2]-1;
int c2 = query[3]-1;
int temp = this.matrix[r1][c1]; // 시작위치 값 임시저장
int min = temp; // min값 초기화
for(int i = r1; i < r2; i++){ // 문제설명 그림의 1번
matrix[i][c1] = matrix[i+1][c1];
if(min > matrix[i][c1]) min = matrix[i][c1];
}
for(int i = c1; i < c2; i++){ // 문제설명 그림의 2번
matrix[r2][i] = matrix[r2][i+1];
if(min > matrix[r2][i]) min = matrix[r2][i];
}
for(int i = r2; i > r1; i--){ // 문제설명 그림의 3번
matrix[i][c2] = matrix[i-1][c2];
if(min > matrix[i][c2]) min = matrix[i][c2];
}
for(int i = c2; i > c1; i--){ // 문제설명 그림의 4번
matrix[r1][i] = matrix[r1][i-1];
if(min > matrix[r1][i]) min = matrix[r1][i];
}
matrix[r1][c1+1] = temp; // 임시저장한 값 저장
return min; //최솟값 반환
}
}
어떻게 풀지 방법은 이해했었다. 로직이 어렵지 않아보였다. 재귀함수로 풀어보았지만, 풀이 도중 너무 햇갈려져서 포기했다. 다른 방법으로 다시 풀어볼까 했지만 한 문제에 너무 시간을 오래 허비하는 것 같아서 답을 찾아봤다. 역시 알고리즘 능력자들은 정말 많다.