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

ynoolee·2022년 2월 17일
0

코테준비

목록 보기
114/146

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

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

(1:00)

문제 이해하기

  • 회전도 시켜야하고
  • 최솟값도 구해야 한다.

먼저, 회전의 수(쿼리의 개수 ) 는 최대 1만개

행,열은 최대 100이다.

→ 하나의 횐전당 이동의 개수는 최대 약, 400개 * 회전의수(최대 1만개)

→ 400만

즉, 브루트 포스로 풀어도 괜찮다.

  • queries
    • queries[0] → x1
    • queries[1] → y1
    • queries[2] → x2
    • queries[3] → y2

rotate 시키는데 실수했다

생각을 잘못하는 바람에

시간이 엄청 많이 걸려버렸다. 계속 덮어쓰기를 하고 있었다.

  • 만약 한 칸 한 칸 씩 이동을 한다면, temp가 두 개 필요하다.
  • 그리고 rotate하는 과정에서 temp는 모든 수가 되어보기 때문에, temp와 min을 비교하며 min을 업데이트 해주면 된다.

class Solution {    
    // 아직 초기화 안함 
    public int[][] board; 

    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];
        board = new int[rows][columns];
        init();
        int idx = 0;
        for(int[] q: queries){
            answer[idx++] = rotate(q[0]-1,q[1]-1,q[2]-1,q[3]-1);
        }
        
        return answer;
    }
    public void init(){
        int cnt = 1; 
        for(int r = 0 ; r < board.length;r++){
            for(int c = 0; c< board[0].length; c++){
                board[r][c] = cnt++;
            }
        }
    }
    public int rotate(int x1,int y1,int x2, int y2){
        int min = board[x1][y1];
        int temp1 = board[x1][y1] ,temp2 = temp1;

        // -> 이동
        for(int y = y1+1; y <= y2; y++){
            temp2 = board[x1][y];
            board[x1][y] = temp1;
            temp1 = temp2;
            min  = Math.min(min,temp1);
        }
        // temp1 에는, [x1][y2]가 들어가 있다.

        for(int x = x1+1; x <= x2 ;x++){
            temp2 = board[x][y2];
            board[x][y2] = temp1;
            temp1 = temp2;
            min  = Math.min(min,temp1);
        }
        // temp1 에는 board[x2][y2]가 들어가 있다.
        // <- 이동
        for(int y = y2-1 ; y >= y1; y--){
            temp2 = board[x2][y];
            board[x2][y] = temp1;
            temp1 = temp2;
            min = Math.min(min,temp1);
        }
        // temp1 에는 board[x2][y1]이 들어가 있다
        for(int x = x2 -1 ; x >= x1 ;x--){
            temp2 = board[x][y1];
            board[x][y1] = temp1;
            temp1 = temp2;
            min = Math.min(min,temp1);
        }

        return min;

    }
    

}

0개의 댓글