TIL_250415

듀듀·2025년 4월 15일

spring_TIL

목록 보기
42/53

행렬 테두리 회전하기

링크텍스트

문제 설명

  1. rows*columns 크기의 행렬에 순서대로 숫자가 삽입되어있다.
  2. queries의 테두리 부분을 시계방향으로 회전시킨다.
  3. 회전된 부분에서 가장 작은 수를 return 한다.

시행착오 및 문제 풀이

우선 틀린 풀이 먼저...
내가 생각한대로 적어보자면

오답 풀이

  1. 이중 for문으로 행렬을 만들어준다.

  2. temp1에 지금 채워 넣어야 할 행렬 자리의 앞의 값(이전 값)을 넣어준다. temp2에는 현재 행렬에 있는 값을 임시로 저장해준다.

  3. 최솟값을 구하기 위해 min 변수를 만들어 가장 큰 값을 저장해준다.

  4. 오른쪽, 아래, 왼쪽, 위 로 나누어 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)을 넣어준다.

  5. 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에 넣기

이렇게 정답! 아 너무 헷갈린다ㅜ


너무 헷갈려서 짜증나는 문제였다

0개의 댓글