⭐️ [프로그래머스 레벨투] 행렬 테두리 회전하기 🔄

9rganizedChaos·2021년 10월 4일
0
post-thumbnail

🔽 문제 링크

https://programmers.co.kr/learn/courses/30/lessons/77485

✍🏼 나의 수도 코드

1) 주어진 rows와 columns로 기본 행렬을 만든다.
2) 회전 함수 rotate를 만든다.
3) rotate는 회전 대상이 되는 요소들을 배열에 담아둔다.
4) rotate를 통해 행렬을 회전시킨다.
5) 배열에 담아둔 요소들중 가장 작은 요소를 minItems 배열에 push하고, 회전이 완료된 행렬로 전역의 matrix를 재할당한다.
6) 반복문을 돌려 queries 매개변수에 넘겨받은 전달인자들로 rotate를 실행한다.
7) minItems를 리턴한다.

👨🏻‍💻 나의 문제 풀이

function solution(rows, columns, queries) {
    let minItems = [];
    
    let matrix = [];
    let basicRow = [...Array(columns)].map((_, i) => i + 1);
    for(let i = 0; i < rows; i++){
        let newRow = basicRow.map(item => item + columns * i)
        matrix.push(newRow)
    }
    
    function rotate(x1, y1, x2, y2){
        let saveArr = [];
        let copyMatrix = matrix.map(item => item.slice());
        
        for(let i = y1; i < y2; i++){
            saveArr.push(matrix[x1 - 1][i])
            copyMatrix[x1 - 1][i] = matrix[x1 - 1][i - 1];
        }
        for(let i = x1; i < x2; i++){
            saveArr.push(matrix[i][y2 - 1])
            copyMatrix[i][y2 - 1] = matrix[i - 1][y2 - 1];
        }
        for(let i = y1 - 1; i < y2 - 1; i++){
            saveArr.push(matrix[x2 - 1][i])
            copyMatrix[x2 - 1][i] = matrix[x2 - 1][i + 1];
        }
        for(let i = x1 - 1; i < x2 - 1; i++){
            saveArr.push(matrix[i][y1 - 1])
            copyMatrix[i][y1 - 1] = matrix[i + 1][y1 - 1];
        }
        minItems.push(Math.min(...saveArr));
        matrix = copyMatrix;
    }
    
    for(let i = 0; i < queries.length; i++){
        rotate(...queries[i]);
    }
    
    return minItems;
}

👩🏻‍💻 다른 사람의 코드

function solution(rows, columns, queries) {
  // 기본행렬을 만든다.
    const a = [...Array(rows)].map((_, r)=>[...Array(columns)].map((_, c)=>r*columns+c+1));
  // 회전 대상이 되는 요소들중 가장 작은 요소를 담아둘 배열 (마지막에 리턴)
    const mins = [];

    queries.map(query => {
      // 배열의 인덱스로 숫자 변환
        const [x1, y1, x2, y2] = query.map(_=>_-1);
        let min = a[x1][y1], tmp = a[x1][y1];

      // 행렬 테두리를 회전하면서, 가장 작은 수를 찾아냄
        for(let i=x1;i<x2;i++) {
            a[i][y1] = a[i+1][y1];
            min = Math.min(min, a[i][y1]);
        }
        for(let i=y1;i<y2;i++) {
            a[x2][i] = a[x2][i+1];
            min = Math.min(min, a[x2][i]);
        }
        for(let i=x2;i>x1;i--) {
            a[i][y2] = a[i-1][y2];
            min = Math.min(min, a[i][y2]);
        }
        for(let i=y2;i>y1;i--) {
            a[x1][i] = a[x1][i-1];
            min = Math.min(min, a[x1][i]);
        }
        a[x1][y1+1] = tmp;

        mins.push(min);
    })

    return mins;
}

🍯 알게 된 것들

  • 2차원 배열 깊은 복사할 때는, 그냥 arr.slice를 하면 안 되고, 내부 배열들까지 일일이 slice를 해주어야 한다. const copy = arr.map(v => v.slice());
  • 1부터 n을 요소로 갖는 배열 만들기, 암기! [...Array(n)].map((_, i) => i + 1)
profile
부정확한 정보나 잘못된 정보는 댓글로 알려주시면 빠르게 수정토록 하겠습니다, 감사합니다!

0개의 댓글