관리 메뉴

LC Studio

Programmers Lv2 행렬 테두리 회전하기 본문

Java/Programmers

Programmers Lv2 행렬 테두리 회전하기

Leopard Cat 2022. 3. 25. 12:01

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

 

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

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

주어진 테두리만큼 행렬을 회전시키고 최솟값을 찾는 문제였다.

어떻게 풀지 고민하다 결국 다른 블로그들을 찾아보고 아이디어를 얻었다.


풀이방식

1. matrix[][] 라는 2차원 기본배열 선언

2. 좌표값을 받아와 배열에 맞게 숫자를 변경(-1)

3. 초기값을 저장 및 최솟값으로 저장

4. 배열을 회전시킴 + 최솟값 비교

    4-1 (왼쪽) 아래에서 위로

    4-2 (아래) 왼쪽에서 오른쪽으로

    4-3 (오른쪽) 위에서 아래로

    4-4 (위) 오른쪽에서 왼쪽으로

5. 초기값을 다시 배열에 넣어줌

6. 최솟값 return

 

아래 코드와 주석을 함께보면 더 잘 이해될 것이다.

class Solution {
    
    int[][] matrix;
    
    public int[] solution(int rows, int columns, int[][] queries) {
        
        this.matrix = new int[rows][columns];
        int[] answer = new int[queries.length];
        
        //기본 배열을 선언합니다
        for(int i=0;i<rows;i++){
            for(int j=0;j<columns;j++){
                matrix[i][j] = i*columns+j+1;
            }
        }
        
        //queries의 개수만큼 반복합니다
        for(int i=0;i<queries.length;i++){
            answer[i] = rotate(queries[i]);
        }
        
        return answer;
    }
    
    public int rotate(int[] query){
        //좌표값을 받아와 배열의 좌표값으로 변환합니다
        int x1 = query[0]-1; 
        int y1 = query[1]-1;
        int x2 = query[2]-1;
        int y2 = query[3]-1;
        
        //시작위치의 값을 최솟값으로 저장해줍니다
        int tmp = this.matrix[x1][y1];
        int min = tmp;
        
        //첫번째 회전
        for(int i = x1;i<x2;i++){
            this.matrix[i][y1] = this.matrix[i+1][y1];
            if(min > this.matrix[i][y1]) min = this.matrix[i][y1];
        }
        
        //두번째 회전
        for(int i = y1;i<y2;i++){
            this.matrix[x2][i] = this.matrix[x2][i+1];
            if(min > this.matrix[x2][i]) min = this.matrix[x2][i];
        }
        
        //세번째 회전
        for(int i = x2;i>x1;i--){
            this.matrix[i][y2] = this.matrix[i-1][y2];
            if(min > this.matrix[i][y2]) min = this.matrix[i][y2];
        }
        
        //네번째 회전
        for(int i = y2;i>y1;i--){
            this.matrix[x1][i] = this.matrix[x1][i-1];
            if(min > this.matrix[x1][i]) min = this.matrix[x1][i];
        }
        
        this.matrix[x1][y1+1] = tmp;
        
        return min;
        
    }
}
반응형