Coding Test/Programmers
[프로그래머스] 행렬 테두리 회전 (java)
Heang Lee
2021. 5. 12. 14:07
코딩테스트 연습 - 행렬 테두리 회전하기 | 프로그래머스 (programmers.co.kr)
어떻게 생각하고 문제를 풀었는가?
행렬에서 테두리를 회전하는 것을 상/하/좌/우 4개의 직선 행렬로 나누어 원소를 한 칸씩 이동시키는 것으로 바꾸어 생각하였습니다.
원소의 이동은 이동할 위치의 원소 값을 따로 저장하고, 해당 위치에 이전 인덱스의 원소를 복사하는 과정을 반복하여 구현할 수 있습니다.
문제에서 주어진 시계방향을 그대로 사용한다면 반복문마다 따로 저장되는 원소의 값을 변경하여야하지만 반시계방향으로 값을 복사한다고 생각한다면 따로 저장해야할 원소는 시작 위치의 원소 뿐으로 메모리 공간을 효율적으로 사용할 수 있습니다.
코드
class Solution {
public int[] solution(int rows, int columns, int[][] queries) {
int[] answer = new int[queries.length];
int[][] numbers = new int[rows][columns];
for(int i=0;i<rows;i++){ //rows == x
for(int j=0;j<columns;j++){ //columns == y
numbers[i][j] = i*columns + j+1;
}
}
for(int k=0; k<queries.length; k++){
int x1 = queries[k][0]-1;
int y1 = queries[k][1]-1;
int x2 = queries[k][2]-1;
int y2 = queries[k][3]-1;
int temp = numbers[x1][y1];
answer[k] = temp;
for(int i=x1;i<x2;i++){//좌측 부분
numbers[i][y1] = numbers[i+1][y1];
if(numbers[i][y1] < answer[k]) answer[k] = numbers[i][y1];
}
for(int i=y1;i<y2;i++){ //하단 부분
numbers[x2][i] = numbers[x2][i+1];
if(numbers[x2][i] < answer[k]) answer[k] = numbers[x2][i];
}
for(int i=x2;i>x1;i--){//우측 부분
numbers[i][y2] = numbers[i-1][y2];
if(numbers[i][y2] < answer[k]) answer[k] = numbers[i][y2];
}
for(int i=y2; i>y1+1; i--){ //상단부분
numbers[x1][i] = numbers[x1][i-1];
if(numbers[x1][i] < answer[k]) answer[k] = numbers[x1][i];
}
numbers[x1][y1+1] = temp;
}
return answer;
}
}
설계를 바탕으로 코드를 작성하였습니다.
코드를 작성할 때 주의해야할 점이 있는데, 문제에서 주어진 x, y는 x행 y열을 의미하기 때문에 Array[x][y]로서 문제를 해결하여야 합니다.
(x, y)의 좌표로서 문제를 바라보신다면 Array[y][x]가 되므로 초기 배열의 값을 넣는 식을 변경해야 할 필요가 있습니다.