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

이윤주·2022년 3월 23일
0

코딩테스트

목록 보기
14/18

x * y 행렬이 있을 때
행렬의 직사각형 모양의 범위를 여러번 선택해(queries), 테두리 부분에 있는 숫자들은 시계방향으로 회전시킴

첫 행렬에는 가로 방향으로 숫자가 1부터 하나씩 증가하면서 적혀있음
=> 아무회전 안했을 시 , i행 j열에 있는 숫자는 (((i-1) columns)+ j)
ex)
6행 6열에서 5행 2열 => 26
= ((5 - 1)
6) + 2 = 26

if) 6,6 행렬에서 [(2,2), (5,4)]를 기준으로 돌린다면

martix에서 행열로 따졌을 때,


행 (2,2) (2,3) (2,4)
(3,2) (3,4)
(4,2) (4,4)
(5,2) (5,3) (5,4)
를 돌려야한다

돌려지는 판을 board라 했을 때
1. {x행 = x1}이고 {y1 <= y열 < y2}이면 오른쪽으로 돌린다.
=> matrix[x1 - 1][y1 -1 <= 값 < y2 - 1] 까지 오른쪽으로 돌려야 함
[8, 9]
2. {x1 <= x행 < x2}이고 {y열 = y2}인 것은 아래쪽으로 돌린다.
=> matrix[x1 - 1 <= 값 < x2 - 1][y2 - 1] 까지 아래쪽으로 돌림
[8, 9, 10, 16, 22]

  1. {x행 = x2}이고 {y1 < y열 <= y2}이면 왼쪽으로 돌린다.
    => matrix[x2 - 1][y1 - 1 < 값 <= y2 - 1] 까지 왼쪽으로 돌림

    [8, 9, 10, 16, 22, 28, 27]

  2. {x1 < x행 <= x2}이고 {y열 = y1}이면 위쪽으로 돌린다.
    => matrix[x1 < 값 <= x2 - 1][y1 - 1] 까지 위쪽으로 돌림
    [8, 9, 10, 16, 22, 28, 27, 26, 20, 14]

board 마지막 index는 앞으로 옮김
[14, 8, 9, 10, 16, 22, 28, 27, 26, 20]

board에서 최솟값 구함

옮겨야하는 martix
martix의 1,1 = board의 0 index
matrix의 1,2 = board의 1 index
martix의 1,3 = board의 2 index
matrix의 2,3 = board의 3 index
matrix의 3,3 = board의 4 index
matrix의 4,3 = board의 5 index
matrix의 4,2 = board의 6 index
matrix의 4,1 = board의 7 index
matrix의 3,1 = board의 8 index
matrix의 2,1 = board의 9 index
로 대입
반복

function solution(rows, columns, queries) {
    var answer = [];    
    let matrix = [];

    for(let i = 1; i <= rows; i++) {
      // row, columns에 따른 행렬 생성
        let row = [];
        for(let j = 1; j <= columns; j++) {
            row.push( ((i - 1) * columns)+ j )    
        }
        matrix.push(row);
    }
    
    for(query of queries) {
      
        let x1 = query[0] -1; // index로 접근해야하니 -1 
        let x2 = query[2] -1; 
        let y1 = query[1] -1; 
        let y2 = query[3] -1; 
        
        let board = rotate(x1, y1, x2, y2, matrix)
        answer.push(Math.min(...board) ) // 최솟값
        
      // 돌려야하는 matrix에 대입
        for(let i = y1; i < y2; i++) {
            matrix[x1][i] = board.shift();
        }
        
        for(let i = x1; i < x2; i++) {
            matrix[i][y2] = board.shift();
        }
        
        for(let i = y2; i > y1; i--) {
            matrix[x2][i] = board.shift();
        }
        
        for(let i = x2; i > x1; i--) {
            matrix[i][y1] = board.shift();
        }
    }
    return answer;
}

function rotate(x1, y1, x2, y2, matrix) {
    let board = [];

    for(let i = y1; i < y2; i++) { // 오른쪽으로 돌려야하는 값 
        board.push(matrix[x1][i])
    } 
   
    for(let i = x1; i < x2; i++) { // 아래쪽
        board.push(matrix[i][y2])
    }
    

    for(let i = y2; i > y1; i--) {  /// 왼쪽
        board.push(matrix[x2][i])
    }
        
    for(let i = x2; i > x1; i--) { // 위쪽
        board.push(matrix[i][y1])
    };
       
    board.unshift(board.pop()); // 마지막 index 앞으로
    return board;
        
    };

0개의 댓글

관련 채용 정보