Algorithm/Programmers

[프로그래머스] 행렬 테두리 회전하기 - Java

ikjo 2022. 7. 6. 17:15

문제 설명

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

접근 방법

해당 문제에서는 n * m 행렬(각 원소 값은 1 ~ n *m)이 주어질 경우 특정 영역의 테두리를 회전시킬 때마다 해당 테두리에서 가장 작은 숫자를 순서대로 구하는 것을 요구하고 있습니다.

 

우선 주어진 테두리 영역 데이터를 통해 회전 축을 정하고 값들을 회전시킬 수 있었습니다. 이때 각각의 원소값들을 회전시킬 때마다 일일이 최소값을 구해주었습니다. 

 

        for (int[] query : queries) {
            rowStart = query[0];
            colStart = query[1];
            rowEnd = query[2];
            colEnd = query[3];

            for (int i = colStart + 1; i <= colEnd; i++) {
                d[rowStart][i] = origin[rowStart][i - 1];
                result = Math.min(result, d[rowStart][i]);
            }

            for (int i = colEnd - 1; i >= colStart; i--) {
                d[rowEnd][i] = origin[rowEnd][i + 1];
                result = Math.min(result, d[rowEnd][i]);
            }

            for (int i = rowStart + 1; i <= rowEnd; i++) {
                d[i][colEnd] = origin[i - 1][colEnd];
                result = Math.min(result, d[i][colEnd]);
            }

            for (int i = rowEnd - 1; i >= rowStart; i--) {
                d[i][colStart] = origin[i + 1][colStart];
                result = Math.min(result, d[i][colStart]);
            }
            
            deepCopy(d, origin, rows, columns);

            answer[resultIndex] = result;
            result = 10001;
            resultIndex++;
        }

 

회전시키는 과정에서 2개의 행렬(d와 origin)을 사용하고 있는데, d의 경우 회전시키고난 후의 행렬, origin의 경우 회전시키기 전의 행렬을 나타내고 있습니다. origin의 경우 회전을 시키는 과정에서 이전 원소 값을 기억하는 용도로 사용했습니다.

 

행렬의 회전을 모두 마친 후에는 회전을 통해 새롭게 만들어진 d 행렬의 원소값들을 origin 행렬에 적용시키도록 했습니다.

    public void deepCopy(int[][] d, int[][] origin, int row, int col) {
        for (int i = 1; i <= row; i++) {
            for (int j = 1; j <= col; j++) {
                origin[i][j] = d[i][j]; 
            }
        }
    }

 

 

 

전체 소스 코드

class Solution {

    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];
        int count = 0;
        int[][] d = new int[rows + 1][columns + 1];
        int[][] origin = new int[rows + 1][columns + 1];
        for (int i = 1; i <= rows; i++) {
            for (int j = 1; j <= columns; j++) {
                d[i][j] = ++count;
                origin[i][j] = count;
            }
        }

        int rowStart, colStart, rowEnd, colEnd;

        int resultIndex = 0, result = 10001;
        for (int[] query : queries) {
            rowStart = query[0];
            colStart = query[1];
            rowEnd = query[2];
            colEnd = query[3];

            for (int i = colStart + 1; i <= colEnd; i++) {
                d[rowStart][i] = origin[rowStart][i - 1];
                result = Math.min(result, d[rowStart][i]);
            }

            for (int i = colEnd - 1; i >= colStart; i--) {
                d[rowEnd][i] = origin[rowEnd][i + 1];
                result = Math.min(result, d[rowEnd][i]);
            }

            for (int i = rowStart + 1; i <= rowEnd; i++) {
                d[i][colEnd] = origin[i - 1][colEnd];
                result = Math.min(result, d[i][colEnd]);
            }

            for (int i = rowEnd - 1; i >= rowStart; i--) {
                d[i][colStart] = origin[i + 1][colStart];
                result = Math.min(result, d[i][colStart]);
            }
            
            deepCopy(d, origin, rows, columns);

            answer[resultIndex] = result;
            result = 10001;
            resultIndex++;
        }

        return answer;
    }
    
    private void deepCopy(int[][] d, int[][] origin, int row, int col) {
        for (int i = 1; i <= row; i++) {
            for (int j = 1; j <= col; j++) {
                origin[i][j] = d[i][j]; 
            }
        }
    }
}

 

 

참고자료