728x90
SMALL
문제 이해
- rows x , columns y 의 행을 가지고 있는 행렬이 있다.
- queries 배열에는 (x1,y1,x2,y2) 의 좌표값을 가지고 있는데 해당 좌표 (x1,y1) 에서 (x2,y2) 범위를 지정하여 테두리 영역만 시계방향으로 한번 회전 시킨다.
- queries 배열에 있는 만큼 회전을 반복한다.
- 회전 할때마다 나오는 최소값들을 배열에 담아서 나타내라.
- 소용돌이 문제로 인식하여 좌표범위의 영역을 상,하,좌,우 방향으로 회전시키면서 배열에 저장시켰다.
- 시계방향으로 회전하면서 이전 좌표의 값을 한칸씩 옮겨야하는데 현재 배열을 그대로 사용하면 이전 좌표값의 값을 알수 없기에 copyArr 배열을 준비하여 소용돌이를 도는동안 copyArr 배열의 값으로 이전 좌표값을 알아낼수 있다.
- 소용돌이가 한바퀴 완료하면 resultArr -> copyArr 로 완전복사하여 queries 배열이 끝날때까지 반복한다.
- result 변수에 제한사항이 원소값 최대가 10000 이하임으로 10001을 넣어주고 좌표를 이동할때마다 Math.min 함수로 최소값이 나올수 있게 설정했다.
import java.util.*;
class Solution {
public int[] solution(int rows, int columns, int[][] queries) {
int[] answer = new int[queries.length];
int[][] resultArr = new int[rows][columns];
int[][] copyArr = new int[rows][columns];
int cnt = 1;
for(int i = 0; i<rows; i++){
for(int j = 0; j<columns; j++){
int n = cnt++;
resultArr[i][j] = n;
copyArr[i][j] = n;
}
}
for(int i = 0; i<queries.length; i++){
int preX = queries[i][0] - 1;
int preY = queries[i][1] - 1;
int postX = queries[i][2] - 1;
int postY = queries[i][3] - 1;
answer[i] = rollingArray(resultArr, copyArr, preX, preY, postX, postY);
}
return answer;
}
// 소용돌이
public int rollingArray(int[][] resultArr, int[][] copyArr, int preX, int preY, int postX, int postY){
int dir = 0; // 0 - 우, 1 - 하, 2 - 좌, 3 - 상
int x = preX; // 세로
int y = preY; // 가로
int result = 10001;
int tmp = 0;
while(true){
if(dir == 0 && y == postY){
dir = 1;
}else if(dir == 1 && x == postX){
dir = 2;
}else if(dir == 2 && y == preY){
dir = 3;
}else if(dir == 3 && x == preX){
resultArr[preX][preY] = copyArr[preX+1][preY];
result = Math.min(result, resultArr[preX][preY]);
break;
}
tmp = copyArr[x][y];
if(dir == 0){
y++;
}else if(dir == 1){
x++;
}else if(dir == 2){
y--;
}else if(dir == 3){
x--;
}
resultArr[x][y] = tmp;
result = Math.min(result, resultArr[x][y]);
}
for(int i = 0; i<resultArr.length; i++){
for(int j = 0; j<resultArr[i].length; j++){
copyArr[i][j] = resultArr[i][j];
}
}
return result;
}
}
728x90
LIST
'자바 > 코딩테스트' 카테고리의 다른 글
[프로그래머스] 리코쳇 로봇 - Java(자바) (0) | 2024.05.30 |
---|---|
[프로그래머스] 야근 지수 - Java(자바) (0) | 2024.05.28 |
[프로그래머스] 두 큐 합 같게 만들기 - Java(자바) (0) | 2024.05.22 |
[프로그래머스] 거리두기 확인하기 - Java(자바) (0) | 2024.05.21 |
[프로그래머스] 괄호 변환 -Java(자바) (0) | 2024.05.13 |