티스토리 뷰

문제풀이

프로그래머스 행렬테두리 (구현) lv2

수박수박좋다 2021. 9. 24. 22:25
반응형

문제출처

생각

처음에 완전 복잡하게 생각했다. 상하좌우로 나누어서 각각 시작점, 끝점을 구해서 상, 하는 n크기로, 좌, 우는 m크기로 쪼개고 바뀔 2차원 배열의 전체를 갈아끼우는 방식으로 접근했는데 너무 복잡해지고 코드도 난해해졌다.

한칸씩 밀고 내리기만 하면 되므로 좌상단의 값을 기억해두었다가 왼쪽 열을 위로올리고 아랫 행을 왼쪽으로 당기고 우측 열을 아래로 내리고 마지막으로 최상단 행을 오른쪽으로 미는 식으로 구현하면 해결할 수 있었다.

코드

const makeMatrix = (rows, columns) => {
    let matrix = []
    for (let i = 0; i < rows; i++){
        matrix.push([]);
    }
    let num = 1;
    for (let i = 0; i < rows * columns; i++){
        matrix[Math.floor(i / columns)].push(num);
        num += 1;
    }
    return matrix;
}


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

    for (let i = 0; i < queries.length; i++){
        let [x1, y1] = [queries[i][0] - 1, queries[i][1] - 1];
        let [x2, y2] = [queries[i][2] - 1, queries[i][3] - 1];

        let tmp = matrix[x1][y1];
        let candi = [tmp];
        for (let i = x1; i < x2; i++){
            matrix[i][y1] = matrix[i + 1][y1];
            candi.push(matrix[i + 1][y1])
        }
        for (let i = y1; i < y2; i++){
            matrix[x2][i] = matrix[x2][i + 1];
            candi.push(matrix[x2][i + 1])

        }
        for (let i = x2; i > x1; i--){
            matrix[i][y2] = matrix[i - 1][y2];
            candi.push(matrix[i - 1][y2])

        }
        for (let i = y2; i > y1; i--){
            matrix[x1][i] = matrix[x1][i - 1];
            candi.push(matrix[x1][i - 1])
        }
        matrix[x1][y1 + 1] = tmp;
        answer.push(Math.min(...candi));
    }

    return answer;
}
반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
농담곰의 고군분투 개발기