본문 바로가기

Algorithm/Programmers

[2021 Dev-Matching: 웹 백엔드 개발자(상반기)][구현] 행렬 테두리 회전하기 - Java

문제 바로가기

 

코딩테스트 연습 - 행렬 테두리 회전하기

6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]

programmers.co.kr

 

올해 여름쯤? 했던 데브 매칭에 나왔던 문제랍니다.

작년 여름에 생애 첫 코테 합격 메일로 데브매칭 코테 합격 메일 받은게 엊그제 같은데 시간 참 빠릅니다.

 

개인적으로는 이런 행렬갖고 노는 문제 진짜 싫어 합니다.

왜냐하면 진짜 싫기 때문입니다.

 

다행히 얘는 그런 류 중에서 제일 쉬운 축에 속하지 않나 싶습니다.

겉 테두리만 슥슥 돌려주면 됩니다.

 

class Solution {
    int[][] matrix;
    
    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];
        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++;
            }
        }
        
        // printMatrix(rows, columns);
        int idx = 0;
        
        for(int[] query : queries) {
            int fromY = query[0] - 1;
            int fromX = query[1] - 1;
            int toY = query[2] - 1;
            int toX = query[3] - 1;
            
            answer[idx++] = rotate(fromY, fromX, toY, toX);
            // printMatrix(rows, columns);
        }
        
        return answer;
    }
    
    int rotate(int fromY, int fromX, int toY, int toX) {
        // 시작점 숫자
        int start = matrix[fromY][fromX];
        int min = matrix[fromY][fromX];
        
        // 왼쪽 아래->위
        for(int y = fromY; y < toY; y++) {
            matrix[y][fromX] = matrix[y + 1][fromX];
            min = Math.min(min, matrix[y][fromX]);
        }
        // 아래 왼->오른
        for(int x = fromX; x < toX; x++) {
            matrix[toY][x] = matrix[toY][x + 1];
            min = Math.min(min, matrix[toY][x]);
        }
        // 오른 위->아래
        for(int y = toY; y > fromY; y--) {
            matrix[y][toX] = matrix[y - 1][toX];
            min = Math.min(min, matrix[y][toX]);
        }
        // 위 오른->왼
        for(int x = toX; x > fromX; x--) {
            matrix[fromY][x] = matrix[fromY][x - 1];
            min = Math.min(min, matrix[fromY][x]);
        }
        
        matrix[fromY][fromX + 1] = start;
        
        return min;
    }
    
    void printMatrix(int rows, int columns) {
        for(int i = 0; i < rows; i++) {
            for(int j = 0; j < columns; j++) {
                System.out.print(matrix[i][j] + " ");
            }
            System.out.println();
        }   
    }
    
}

 

한 번 IDE 를 쓰지 않고 풀어보았습니다. 쉽지 않네요

그냥 하라는 대로 삭삭 돌려주면 됩니다.

로직 상으로는 밀어준다가 좀 더 맞는 표현같네요.

1~2년 동안 행렬 돌리는건 이렇게 밖에 못짜는데, 다른 좋은 방법 있음 댓글 날려 주세요.

 

삼성 준비할 땐가.. 별 희한하게 행렬을 돌리란 문제도 몇번 봤었는데.. 죽는 줄 알았습니다

암튼 행렬이랑 사이가 별로 안좋습니다 전.

 

감 좀 잡고 어려운 문제 도전하기!!!! 화이팅!!!!!!!