[Algorithm] Programmers_Lv2 행렬 테두리 회전하기_JavaScript

Mubby·2022년 4월 20일
0

알고리즘(3xx)

목록 보기
3/3
post-thumbnail

전체 소스 코드

function solution(rows, columns, queries) {
  
    let answer = [];
    let myArray = Array.from(new Array(rows), () => new Array(columns).fill(1))
                    .map((row, r) => row.map((v, c) => (r * columns) + (c + 1)));

    for (let query of queries) {
        let row1 = query[0]-1;
        let col1 = query[1]-1;
        let row2 = query[2]-1;
        let col2 = query[3]-1;

        let tmpArr = new Array();

        for (let idx = col1; idx < col2; idx++) { tmpArr.push(myArray[row1][idx]); }
        for (let idx = row1; idx < row2; idx++) { tmpArr.push(myArray[idx][col2]); }
        for (let idx = col2; idx > col1; idx--) { tmpArr.push(myArray[row2][idx]); }
        for (let idx = row2; idx > row1; idx--) { tmpArr.push(myArray[idx][col1]); }
        
        tmpArr.unshift(tmpArr.pop());

        let cnt = 0;
        for (let idx = col1; idx < col2; idx++) { myArray[row1][idx] = tmpArr[cnt++]; }
        for (let idx = row1; idx < row2; idx++) { myArray[idx][col2] = tmpArr[cnt++]; }
        for (let idx = col2; idx > col1; idx--) { myArray[row2][idx] = tmpArr[cnt++]; }
        for (let idx = row2; idx > row1; idx--) { myArray[idx][col1] = tmpArr[cnt++]; }

        answer.push(Math.min(...tmpArr));
    }
  
    return answer;
  
}

문제 설명

rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다.

이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현합니다.

행렬의 rows, columns, 그리고 회전들의 목록[(x1, y1, x2, y2), ... ]이 주어질 때, 각 회전들을 행렬에 적용한 뒤, 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 넣어 return하는 문제입니다.

입출력 예시

rowscolumnsqueriesresult
66[[2,2,5,4],[3,3,6,6],[5,1,6,3]][8, 10, 25]

  • 예시의 회전 목록을 수행하는 과정을 그림으로 표현하면 다음과 같습니다.




문제 자체는 어렵지 않았으나, 배열 선언 및 초기화 과정에서 ES6 문법에 익숙해지고 또한 아름다운 코드를 짜보자는 욕심에 강아지 고생을 하게 되었습니다.

이를 오래 기억하며 더욱 학습하자는 의미로 포스팅합니다.



참고 사이트:
프로그래머스 - 행렬 테두리 회전하기

0개의 댓글