문제 설명
접근 방법
해당 문제에서는 n * m 행렬(각 원소 값은 1 ~ n *m)이 주어질 경우 특정 영역의 테두리를 회전시킬 때마다 해당 테두리에서 가장 작은 숫자를 순서대로 구하는 것을 요구하고 있습니다.
우선 주어진 테두리 영역 데이터를 통해 회전 축을 정하고 값들을 회전시킬 수 있었습니다. 이때 각각의 원소값들을 회전시킬 때마다 일일이 최소값을 구해주었습니다.
for (int[] query : queries) {
rowStart = query[0];
colStart = query[1];
rowEnd = query[2];
colEnd = query[3];
for (int i = colStart + 1; i <= colEnd; i++) {
d[rowStart][i] = origin[rowStart][i - 1];
result = Math.min(result, d[rowStart][i]);
}
for (int i = colEnd - 1; i >= colStart; i--) {
d[rowEnd][i] = origin[rowEnd][i + 1];
result = Math.min(result, d[rowEnd][i]);
}
for (int i = rowStart + 1; i <= rowEnd; i++) {
d[i][colEnd] = origin[i - 1][colEnd];
result = Math.min(result, d[i][colEnd]);
}
for (int i = rowEnd - 1; i >= rowStart; i--) {
d[i][colStart] = origin[i + 1][colStart];
result = Math.min(result, d[i][colStart]);
}
deepCopy(d, origin, rows, columns);
answer[resultIndex] = result;
result = 10001;
resultIndex++;
}
회전시키는 과정에서 2개의 행렬(d와 origin)을 사용하고 있는데, d의 경우 회전시키고난 후의 행렬, origin의 경우 회전시키기 전의 행렬을 나타내고 있습니다. origin의 경우 회전을 시키는 과정에서 이전 원소 값을 기억하는 용도로 사용했습니다.
행렬의 회전을 모두 마친 후에는 회전을 통해 새롭게 만들어진 d 행렬의 원소값들을 origin 행렬에 적용시키도록 했습니다.
public void deepCopy(int[][] d, int[][] origin, int row, int col) {
for (int i = 1; i <= row; i++) {
for (int j = 1; j <= col; j++) {
origin[i][j] = d[i][j];
}
}
}
전체 소스 코드
class Solution {
public int[] solution(int rows, int columns, int[][] queries) {
int[] answer = new int[queries.length];
int count = 0;
int[][] d = new int[rows + 1][columns + 1];
int[][] origin = new int[rows + 1][columns + 1];
for (int i = 1; i <= rows; i++) {
for (int j = 1; j <= columns; j++) {
d[i][j] = ++count;
origin[i][j] = count;
}
}
int rowStart, colStart, rowEnd, colEnd;
int resultIndex = 0, result = 10001;
for (int[] query : queries) {
rowStart = query[0];
colStart = query[1];
rowEnd = query[2];
colEnd = query[3];
for (int i = colStart + 1; i <= colEnd; i++) {
d[rowStart][i] = origin[rowStart][i - 1];
result = Math.min(result, d[rowStart][i]);
}
for (int i = colEnd - 1; i >= colStart; i--) {
d[rowEnd][i] = origin[rowEnd][i + 1];
result = Math.min(result, d[rowEnd][i]);
}
for (int i = rowStart + 1; i <= rowEnd; i++) {
d[i][colEnd] = origin[i - 1][colEnd];
result = Math.min(result, d[i][colEnd]);
}
for (int i = rowEnd - 1; i >= rowStart; i--) {
d[i][colStart] = origin[i + 1][colStart];
result = Math.min(result, d[i][colStart]);
}
deepCopy(d, origin, rows, columns);
answer[resultIndex] = result;
result = 10001;
resultIndex++;
}
return answer;
}
private void deepCopy(int[][] d, int[][] origin, int row, int col) {
for (int i = 1; i <= row; i++) {
for (int j = 1; j <= col; j++) {
origin[i][j] = d[i][j];
}
}
}
}
참고자료
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] 조이스틱 - Java (0) | 2022.07.10 |
---|---|
[프로그래머스] 소수 찾기 - Java (0) | 2022.07.07 |
[프로그래머스] [1차] 뉴스 클러스터링 - Java (0) | 2022.07.05 |
[프로그래머스] 단체 사진 찍기 - Java (0) | 2022.07.03 |
[프로그래머스] 구명보트 - Java (0) | 2022.05.29 |