알고리즘
프로그래머스 - 행렬 테두리 회전하기(JAVA)
쿠키담임선생님
2022. 12. 1. 19:35
풀이방법
4방향을 구간별로 나누어서 생각하면 된다.
일단 가장 왼쪽 위에 있는 부분을 temp 임시변수에 저장해두고 왼쪽부터 한칸 밀어올리고 빈자리에 아래부분을 또 밀어넣고 그 다음은 오른쪽라인, 그 뒤는 위쪽라인 밀어넣은 뒤 빼둔 temp를 끼워맞춰주면 된다.
코드
class Solution {
static int[][]map;
public int[] solution(int rows, int columns, int[][] queries) {
int[] answer = new int[queries.length];
//rows 와 columns 를 입력받고 그만큼의 배열을 생성 후 배열에 값을 넣어준다 최소1부터 두개 곱한게 최대값
map = new int[rows][columns];
int idx = 1;
for(int i =0;i<rows; i++){
for(int j =0; j<columns; j++){
map[i][j] = idx++;
}
}
//이제 배열 돌리기 할 차례. 함수로 만들고 세번 넣는다.
for(int i = 0 ;i<queries.length;i++){
answer[i] = turnOver(queries[i]);
}
return answer;
}
public static int turnOver(int[]query){
int r1 = query[0]-1;
int c1 = query[1]-1;
int r2 = query[2]-1;
int c2 = query[3]-1;
int temp = map[r1][c1];
int min = temp;
for(int i = r1; i<r2; i++){ //좌측 면 이동
map[i][c1] = map[i+1][c1];
if(min>map[i][c1]){ //최솟값 갱신해줌
min = map[i][c1];
}
}
for(int i = c1; i< c2; i++){//아래 면 이동. 좌측다음 아래인 이유는 좌측을 하나씩 떙겨서 빈자리가 생기기때문.
map[r2][i] = map[r2][i+1];
if(min>map[r2][i]){
min = map[r2][i];
}
}
for(int i = r2; i>r1; i--){
map[i][c2] = map[i-1][c2];
if(min>map[i][c2]){
min = map[i][c2];
}
}
for(int i = c2; i>c1; i--){
map[r1][i] = map[r1][i-1];
if(min>map[r1][i]){
min = map[r1][i];
}
}
map[r1][c1+1] = temp; //임시저장햇던거 끼워넣어줌
return min;
}
}