[프로그래머스] 행렬 테두리 회전하기(swtich보다 더 좋은 방법)

쿼카쿼카·2023년 5월 1일
0

알고리즘

목록 보기
57/67

문제

코드

// 내가 푼 풀이
function solution(rows, columns, queries) {
    const ans = [];
    
    const arr = []
    
    for(let i=0; i<rows; i++) {
        const rowArr = [];
        for(let j=0; j<columns; j++) {
            rowArr.push(rows*i+j+1)
        }
        arr.push(rowArr);
    }
    console.log(arr);
    
    for(let curArr of queries) {
        const maxCol = curArr[3] - 1,
              maxRow = curArr[2] - 1,
              minRow = curArr[0] - 1,
              minCol = curArr[1] - 1,
              len = ((maxRow-minRow) + (maxCol-minCol))*2;
        let curCol = minCol, curRow = minRow, next = arr[curRow][curCol], dir = 'R'
        const roopNum = [next];
        for(let i=0; i<len; i++) {
            const target = next
            switch(dir) {
                case 'R':
                    next = arr[curRow][++curCol];
                    arr[curRow][curCol] = target;
                    if(curCol === maxCol) dir = 'D'
                    break;
                case 'D':
                    next = arr[++curRow][curCol];
                    arr[curRow][curCol] = target;
                    if(curRow === maxRow) dir = 'L'
                    break;
                case 'L':
                    next = arr[curRow][--curCol];
                    arr[curRow][curCol] = target;
                    if(curCol === minCol) dir = 'U'
                    break;
                case 'U':
                    next = arr[--curRow][curCol];
                    arr[curRow][curCol] = target;
                    if(curRow === minRow) dir = 'R'
                    break;
            }
            roopNum.push(next);
        }
        ans.push(Math.min(...roopNum))
    }
    
    return ans;
}

// 더 빠른풀이
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;
}

switch를 이용한 풀이

  • 행렬의 회전이나 이동은 항상 switch를 이용해 풀었어요!
  • 방향과 첫 값을 저장해주고, min 혹은 max에 닿으면 방향을 바꿔줘요.
  • 선언이 많고, 비슷한 동작을 반복하는 코드라 지저분해요ㅎㅎㅎ

테두리만 도니까 for를 4번 돌아!

  • 더 빠른 풀이는 어차피 테두리만 도니까 min max 값 정해두고, 각 변을 한 번씩 총 4번을 돌아요.
  • 시간이 훨씬 빠르다..
profile
쿼카에요

0개의 댓글