코테/lvl2

프로그래머스 행렬 테두리 회전하기(lvl2) 풀어보기

디비드킴 2026. 10. 20. 14:52

문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/77485

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제 핵심

ows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, 그 의미는 다음과 같습니다.

  • x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다.

알고리즘

1.입력받은대로 2차원 배열 생성

2.쿼리들 순회하기

-첫가로줄순회

-오른쪽세로줄순회

-아래가로줄순회

-왼쪽세로순회

3.순회하면서 최솟값구하고 해당값 다음 좌표 저장하기

-다음좌표값은 시계방향대로 이며, 각줄 끝자리 값 잘 처리하기


코드

 

 public static int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];
        int[][] matrix = new int[rows][columns];
        int num = 1;
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < columns; j++) {
                matrix[i][j] = num++;
            }
        }
        System.out.println(Arrays.deepToString(matrix));
        int anserIndex = 0;
        for (int[] query : queries) {
            int srow = query[0] - 1;
            int scol = query[1] - 1;
            int erow = query[2] - 1;
            int ecol = query[3] - 1;
            System.out.println("srow=" + srow + ", scol=" + scol + ", erow=" + erow + ", ecol=" + ecol);
            int min = Integer.MAX_VALUE;
            List<int[]> nums = new LinkedList<>();
            for (int i = scol; i <= ecol; i++) {
                System.out.print(matrix[srow][i]);
                if(i==ecol){
                    nums.add(new int[] { matrix[srow][i], srow+1, i });
                }else{
                    nums.add(new int[] { matrix[srow][i], srow, i+1 });
                }
                if (min > matrix[srow][i]) {
                    System.out.println("1최소수갱신");
                    min = matrix[srow][i];
                }
            }
            System.out.println(nums.stream().map(Arrays::toString).toList());
            for (int i = srow + 1; i <= erow; i++) {
                System.out.print(matrix[i][ecol]);
                  if(i==erow){
                nums.add(new int[] { matrix[i][ecol], i, ecol-1 });
                  }else{
                    nums.add(new int[] { matrix[i][ecol], i+1, ecol });
                  }
                if (min > matrix[i][ecol]) {
                    System.out.println("2최소수갱신");
                    min = matrix[i][ecol];
                }
            }
            System.out.println(nums.stream().map(Arrays::toString).toList());
            for (int i = ecol - 1; i >= scol; i--) {
                System.out.print(matrix[erow][i]);
                if(i==scol){
                    nums.add(new int[] { matrix[erow][i], erow-1, i });
                }else{
                    nums.add(new int[] { matrix[erow][i], erow, i-1 });
                }
                if (min > matrix[erow][i]) {
                    System.out.println("3최소수갱신");
                    min = matrix[erow][i];
                }
            }
            System.out.println(nums.stream().map(Arrays::toString).toList());
            for (int i = erow - 1; i > srow; i--) {
                System.out.print(matrix[i][scol]);
                if(i==srow){
                    nums.add(new int[] { matrix[i][scol], i, scol+1 });
                }else{
                    nums.add(new int[] { matrix[i][scol], i-1, scol });
                }
                if (min > matrix[i][scol]) {
                    System.out.println("4최소수갱신");
                    min = matrix[i][scol];
                }
            }
            System.out.println("최소수: " + min);
            answer[anserIndex] = min;
            anserIndex += 1;
            Collections.rotate(nums, 1);
            System.out.println(nums.stream().map(Arrays::toString).toList());
            for(int[]numArr:nums){
                matrix[numArr[1]][numArr[2]]=numArr[0];
            }
        }
        System.out.println(Arrays.deepToString(matrix));
        System.out.println(Arrays.toString(answer));
        return answer;
    }

 


결과


gpt피드백

1. 알고리즘 평가

현재 알고리즘에는 불필요한 작업이 하나 있어.

이미 목적지 좌표를 계산했는데 Collections.rotate(nums, 1)까지 수행하고 있다는 점이야.

 

2. 코드 평가

개선점

① 반복되는 최솟값 비교

② LinkedList 대신 ArrayList

③ 불필요한 조건문 제거

 
 
 

후기

얼핏 보기엔 어려운 문제같아보였으나

하나씩 쪼개면 쉬운문제였다