
우선 틀린 풀이 먼저...
내가 생각한대로 적어보자면
이중 for문으로 행렬을 만들어준다.
temp1에 지금 채워 넣어야 할 행렬 자리의 앞의 값(이전 값)을 넣어준다. temp2에는 현재 행렬에 있는 값을 임시로 저장해준다.
최솟값을 구하기 위해 min 변수를 만들어 가장 큰 값을 저장해준다.
오른쪽, 아래, 왼쪽, 위 로 나누어 for문을 돌려 자리를 채운다.
4-1. 오른쪽: 시작x로 고정하고 시작y -> 마지막y까지 반복하며 뒷자리에 이전 값(temp1)을 넣어준다.
4-2. 아래: 마지막 y로 고정하고 시작x -> 마지막x까지 반복하며 뒷자리에 이전 값(temp1)을 넣어준다.
4-3. 왼쪽: 마지막 x로 고정하고 마지막y -> 시작y까지 반복하며 뒷 자리에 이전 값(temp1)을 넣어준다.
4-4. 위: 시작y로 고정하고 마지막x -> 시작x까지 반복하며 뒷 자리에 이전 값(temp1)을 넣어준다.
answer에 최솟값을 담는다.
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 num = 1;
for(int i=0; i<rows; i++) {
for(int j=0; j<columns; j++) {
map[i][j] = num;
num++;
}
}
int idx = 0;
for(int[] q:queries) {
int start_x = q[0]-1;
int start_y = q[1]-1;
int last_x = q[2]-1;
int last_y = q[3]-1;
//이전 값
int temp1 = 0;
//현재 값
int temp2 = 0;
//제일 작은 값
int min = rows*columns;
//오른쪽
for(int i=start_y; i<last_y; i++) {
temp1 = map[start_x][i];
temp2 = map[start_x][i+1];
map[start_x][i+1] = temp1;
min = Math.min(min,temp1);
}
//아래
for(int i=start_x; i<last_x; i++) {
temp1 = map[i][last_y];
temp2 = map[i+1][last_y];
map[i+1][last_y] = temp1;
min = Math.min(min,temp1);
}
//왼쪽
for(int i=last_y; i>start_y; i--) {
temp1 = map[last_x][i];
temp2 = map[last_x][i-1];
map[last_x][i-1] = temp1;
min = Math.min(min,temp1);
}
//위
for(int i=last_x; i>start_x; i--) {
temp1 = map[i][start_y];
temp2 = map[i-1][start_y];
map[i-1][start_y] = temp1;
min = Math.min(min,temp1);
}
answer[idx] = min;
idx++;
for(int k=0; k<map.length; k++) {
for(int h=0; h<map[0].length; h++) {
System.out.print(map[k][h]);
}
System.out.println();
}
}
return answer;
}
}
결과
입력값 〉 6, 6, [[2, 2, 5, 4], [3, 3, 6, 6], [5, 1, 6, 3]]
기댓값 〉 [8, 10, 25]
실행 결과 〉 실행한 결괏값 [8,15,25]이 기댓값 [8,10,25]과 다릅니다.
출력 〉 123456
78881112
1381581718
1982182324
258882930
313233343536
123456
78881112
13815151515
1981582315
2581582915
313215151515
123456
78881112
13815151515
1981582315
25252582915
252525151515
답이 이상하게 나와서
for(int k=0; k<map.length; k++) {
for(int h=0; h<map[0].length; h++) {
System.out.print(map[k][h]);
}
System.out.println();
}
map을 출력해서 보았더니 회전한 부분이 다 8로 되어있었다.
시계방향으로 밀린 게 아니라 그저 작은 수로 채워진...
내가 뭘 잘못했지 도대체...!!!!
그래서 다시 연습장에 그림을 그려가며 내 코드를 대입해보았다.
아하! temp2를 temp1로 갱신해주지 않았구나! ㅇㅋㅇㅋ
하면서 고쳤지만 또 틀림 그래서 다시 다시 연습장에 슥슥...
아하22! for문이 돌아가면서 temp1이 그 전의 값으로 저장되는데 이미 나는 그 전의 행렬에(원래 9였던 자리에) 그 전의 값(8)을 넣어놨기 때문에 temp1은 계속 8이 된다.
좀 차분하게 생각했으면 실수 하지 않았을 것 같은데... 분하다.
그래서 다시 작성한 코드
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 num = 1;
for(int i=0; i<rows; i++) {
for(int j=0; j<columns; j++) {
map[i][j] = num;
num++;
}
}
int idx = 0;
for(int[] q:queries) {
int start_x = q[0]-1;
int start_y = q[1]-1;
int last_x = q[2]-1;
int last_y = q[3]-1;
//이전 값
int temp1 = 0;
//현재 값
int temp2 = 0;
//제일 작은 값
int min = rows*columns;
//오른쪽
temp1 = map[start_x][start_y];
for(int i=start_y; i<last_y; i++) {
temp2 = map[start_x][i+1];
map[start_x][i+1] = temp1;
temp1 = temp2;
min = Math.min(min,temp2);
}
//아래
for(int i=start_x; i<last_x; i++) {
temp2 = map[i+1][last_y];
map[i+1][last_y] = temp1;
temp1 = temp2;
min = Math.min(min,temp2);
}
//왼쪽
for(int i=last_y; i>start_y; i--) {
temp2 = map[last_x][i-1];
map[last_x][i-1] = temp1;
temp1 = temp2;
min = Math.min(min,temp2);
}
//위
for(int i=last_x; i>start_x; i--) {
temp2 = map[i-1][start_y];
map[i-1][start_y] = temp1;
temp1 = temp2;
min = Math.min(min,temp2);
}
answer[idx] = min;
idx++;
// for(int k=0; k<map.length; k++) {
// for(int h=0; h<map[0].length; h++) {
// System.out.print(map[k][h]);
// }
// System.out.println();
// }
}
return answer;
}
}
회전 시작할 때 temp1에 최초값 넣어놓고 회전돌리면서 temp2만 갱신하면서 temp1에 넣기
이렇게 정답! 아 너무 헷갈린다ㅜ
너무 헷갈려서 짜증나는 문제였다