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

K S Michael·2022년 3월 19일
0

알고리즘

목록 보기
1/5

param : 행, 렬, [회전구역]
행과 열로 테이블을 만든다.
(반복문) 회전 구역 길이 만큼
상 : 왼쪽에서 오른쪽으로 temp 배열에 추가
우 : 위에서 아래로 temp 배열에 추가
하 : 오른쪽에서 왼쪽으로 배열에 추가
좌 : 아래에서 위로 temp 배열에 추가

  • 위 반복문을 돌때, temp 배열에 추가될 내용이 중복되지 않게 한다.

temp 마지막요소를 0번 index로 이동한다.
temp의 최소값을 answer에 추가한다.

위 반복문을 돌면서 temp 배열을 순서대로 추가한다.

  • 성능 향상
    마지막 temp 배열을 돌때는 answer 를 이미 저장했기 때문에
    테이블을 업데이트 하지 않아도 된다.
function solution(rows, columns, queries) {
    var answer = [];
    // 2차원 배열 만들기
    let arr = Array(rows)
    for(let i = 0 ; i < rows ; i++){
        arr[i] = Array(columns)
        for(let j = 0 ; j < columns ; j++ ){
            arr[i][j] = (i) * columns + j+1
        }
    }
    // console.log(arr)
    // query 개수 만큼 반복
        // 영역 사이의 테두리 위치 구하기 
    for(let z = 0 ; z < queries.length ; z++){
        let r1 = queries[z][0] -1
        let c1 = queries[z][1] -1
        let r2 = queries[z][2] -1
        let c2 = queries[z][3] -1
        let order = []
        for(let i = c1 ; i <= c2 ; i++){// top , left에서 right로 이동
            order.push(arr[r1][i])
        }
        for(let i = r1+1 ; i <= r2 ; i++){ // right , top에서 bottom으로 이동
            order.push(arr[i][c2])
        }
        for(let i = c2-1 ; i >= c1 ; i--){ // bottom , right에서 left로 이동
            order.push(arr[r2][i])
        }
        for(let i = r2-1 ; i > r1 ; i--){ // right , bottom에서 top로 이동
            order.push(arr[i][c1])
        }
        order.unshift(order[order.length-1])
        let min = Math.min(...order)
        answer.push(min)
        order.pop()
        for(let i = c1 ; i <= c2 ; i++){// top , left에서 right로 이동
           arr[r1][i] = order.shift()

        }
        for(let i = r1+1 ; i <= r2 ; i++){ // right , top에서 bottom으로 이동

            arr[i][c2] = order.shift()
        }
        for(let i = c2-1 ; i >= c1 ; i--){ // bottom , right에서 left로 이동
            arr[r2][i] = order.shift()
        }
        for(let i = r2-1 ; i > r1 ; i--){ // right , bottom에서 top로 이동
            arr[i][c1] = order.shift()
        }
        // console.log(order)
        order = []
    } 
    
    
    return answer;
}
profile
차근차근

0개의 댓글

관련 채용 정보