구현문제 풀듯이 접근했다.
map을 먼저 만들고 시계방향으로 도는 방법을 diry, dirx 를 통해서
우,하,좌,상 으로 좌표가 이동하도록 했다.int [] diry={0,1,0,-1}; int [] dirx={1,0,-1,0};
i를 변수로 가지는 for문은 queries만큼 반복하는 반복문이다.
i-for문이 돌때마다 변수값들이 다시 세팅된다.j를 변수로 가지는 for문은 시계방향으로 도는 인덱스를 잡아주는 for문이다.
j가 짝수일때는 오른쪽, 왼쪽 / j가 홀수일때는 아래, 위 방향으로만 움직인다.이동한 값으로 기존에 있는 값이 덮어지게 되므로 temp는 값이 덮어지기전에 기존에 있는값을 저장해둔다. 단 최초 이동시엔 0으로 세팅해둔다.
start_y, start_x는 최초로 시작하거나, 이전위치
now_y, now_x는 시계방향으로 한칸 이동한 후의 위치이다.
temp2는 값의 원활한 swap을 위해서 추가했다.
temp2는 이동한 후의 값을 저장하고 그 값을 temp와 바꿔주는 역할을 한다.int now_y = start_y + diry[j]; int now_x = start_x + dirx[j]; int temp2 = map[now_y][now_x]; map[now_y][now_x] = temp; temp=temp2;
이동한 후에는 현재위치가 다음 반복문에서의 이전 위치가 된다.
start_y = now_y; start_x = now_x;
반복문을 돌때마다 최소값을 비교해가며 돌며 i반복문이 한바퀴 돌때마다 answer[i]에 해당 값을 저장한다.
import java.util.*;
class Solution {
public int[] solution(int rows, int columns, int[][] queries) {
int[] answer = new int[queries.length];
int [][] map = new int[rows][columns];
int idx =1;
int [] diry={0,1,0,-1};
int [] dirx={1,0,-1,0};
for(int i=0; i<map.length;i++){
for(int j=0; j<map[0].length; j++){
map[i][j] =idx++;
}
}
for(int i=0; i<queries.length; i++){
int start_y = queries[i][0]-1;
int start_x = queries[i][1]-1;
int minnum = Integer.MAX_VALUE;
int temp =0;
for(int j=0; j<4; j++){
if(j%2==0){
for(int p=0; p<queries[i][3]-queries[i][1]; p++){
int now_y = start_y + diry[j];
int now_x = start_x + dirx[j];
if(temp==0){
temp = map[now_y][now_x];
map[now_y][now_x] = map[start_y][start_x];
start_y = now_y;
start_x = now_x;
}else{
int temp2 = map[now_y][now_x];
map[now_y][now_x] = temp;
temp=temp2;
start_y = now_y;
start_x = now_x;
}
minnum = Math.min(minnum,temp);
}//p
}else{
for(int k=0; k<queries[i][2]-queries[i][0]; k++){
int now_y = start_y + diry[j];
int now_x = start_x + dirx[j];
int temp2 = map[now_y][now_x];
map[now_y][now_x] = temp;
temp=temp2;
start_y = now_y;
start_x = now_x;
minnum = Math.min(minnum,temp);
}//k
}//j-else
}//j
answer[i] = minnum;
}//i
return answer;
}
}