Algorithm/programmers

행렬 테두리 회전하기 ( Level 2, JavaScript, 2021 Dev-Matching )

takeU 2021. 8. 18. 16:25
반응형

행렬 테두리 회전하기 ( Level 2 )

2021 Dev-Matching: 웹 백엔드 개발자(상반기) ( JavaScript )

문제 링크

 

나의 풀이

function solution(rows, columns, queries) {
    const arr = Array(rows).fill(1)
        .map((el, i) => Array(columns).fill(el + i * columns)
        .map((a, i) => a + i)
    )
    const res = []
    while ( queries.length ) {
        const query = queries.shift();
        let num = [];
        for ( let i = query[1]; i < query[3]; i++ ) num.push(arr[query[0]-1][i-1])
        for ( let i = query[0]; i < query[2]; i++ ) num.push(arr[i-1][query[3]-1])
        for ( let i = query[3]; i > query[1]; i-- ) num.push(arr[query[2]-1][i-1])
        for ( let i = query[2]; i > query[0]; i-- ) num.push(arr[i-1][query[1]-1])
        num = [...num.slice(-1), ...num.slice(0, -1)]
        res.push(Math.min(...num))
        for ( let i = query[1]; i < query[3]; i++ ) arr[query[0]-1][i-1] = num.shift()
        for ( let i = query[0]; i < query[2]; i++ ) arr[i-1][query[3]-1] = num.shift()
        for ( let i = query[3]; i > query[1]; i-- ) arr[query[2]-1][i-1] = num.shift()
        for ( let i = query[2]; i > query[0]; i-- ) arr[i-1][query[1]-1] = num.shift()
    }
    return res
}
  1. 1부터 차례대로 들어가는 이중배열을 만든다.
  2. 시계방향으로 회전하는 숫자를 num에 모두 담은 뒤 마지막 요소를 맨 앞으로 보낸다.
  3. num 에서 가장 작은 값을 res에 푸시
  4. 행렬에 num 을 순서대로 재배치한다.
  5. 이 과정을 반복한 뒤 res 리턴