지금까지 풀어봤던 문제중에 가장 이해가 안가고 어려웠던 문제였다.
문제는 금방 이해했는데 어떻게 풀어야 할지 감도 안왔었다.
일단 문제에서 주어진 기본 행렬을 생성하고 한참을 고민해도 해결 방법이 떠오르질 않았다.
별수없이 다른분들의 코드를 참고했는데 이 코드들도 이해가 가지를 않았다.
검색해보니 회전 알고리즘을 알면 쉽게 풀수 있는 문제라는 글을 봐서
유튜브에서 회전 알고리즘에 대해 설명하는 동영상을 보고야 겨우 이해를 했다.
생각날때마다 다시 풀며 익숙해지도록 해야겠다.
(혹시 코드를 보고서도 이해가 잘 가지 않는분들은 이 강의를 보고 코드를 다시 보면 풀 수 있을것 같아 첨부합니다.)
최종 코드
class Solution {
static int[][] matrix;
public int[] solution(int rows, int columns, int[][] queries) {
int[] answer = new int[queries.length];
int plus = 0;
// 기본 행렬 생성
matrix = new int[rows][columns];
for(int i=0; i<rows; i++) {
for(int j=0; j<columns; j++) {
plus ++;
matrix[i][j] = plus;
}
}
for(int i=0; i<queries.length; i++) {
answer[i] = rotate(queries[i][0], queries[i][1], queries[i][2], queries[i][3]);
}
return answer;
}
// 회전 함수 만들기
static int rotate(int x1, int y1, int x2, int y2) {
// 행렬과 배열을 --로 맞춰주기
x1--;
y1--;
x2--;
y2--;
// 임의의 값 하나 잡아서 temp로 빼기
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; i--) {
matrix[x1][i] = matrix[x1][i - 1];
min = Math.min(min, matrix[x1][i]);
}
matrix[x1][y1 + 1] = temp;
return min;
}
}
'코딩 테스트' 카테고리의 다른 글
(Java) 프로그래머스 JadenCase (0) | 2021.10.19 |
---|---|
(Java) 프로그래머스 가장 큰 수 (0) | 2021.10.19 |
(Java) 프로그래머스 더 맵게 (0) | 2021.10.17 |
(Java) 프로그래머스 기능 개발 (0) | 2021.10.17 |
(Java) 프로그래머스 로또의 최고순위와 최저순위 (0) | 2021.09.08 |