Programmers 행렬 테두리 회전하기

💻 Programmers(프로그래머스) 행렬 테두리 회전 문제 - Javascript

문제 설명

  • rows x columns 크기의 행렬이 주어 집니다.

아래 그림은 6 x 6 행렬

  • 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, 그 의미는 다음과 같습니다.

x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다.

이 행렬에 (2, 2, 5, 4) 회전을 적용하면, 아래 그림과 같이 2행 2열부터 5행 4열까지 영역의 테두리가 시계방향으로 회전합니다. 이때, 중앙의 15와 21이 있는 영역은 회전하지 않는 것을 주의하세요.

  • 출력
    행렬의 세로 길이(행 개수) rows, 가로 길이(열 개수) columns, 그리고 회전들의 목록 queries가 주어질 때, 각 회전들을 배열에 적용한 뒤, 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.

제한사항

  • rows는 2 이상 100 이하인 자연수입니다.
  • columns는 2 이상 100 이하인 자연수입니다.
  • 처음에 행렬에는 가로 방향으로 숫자가 1부터 하나씩 증가하면서 적혀있습니다.
    즉, 아무 회전도 하지 않았을 때, i 행 j 열에 있는 숫자는 ((i-1) x columns + j)입니다.
  • queries의 행의 개수(회전의 개수)는 1 이상 10,000 이하입니다.
  • queries의 각 행은 4개의 정수 [x1, y1, x2, y2]입니다.
    x1 행 y1 열부터 x2 행 y2 열까지 영역의 테두리를 시계방향으로 회전한다는 뜻입니다.
    1 ≤ x1 < x2 ≤ rows, 1 ≤ y1 < y2 ≤ columns입니다.
    모든 회전은 순서대로 이루어집니다.
    예를 들어, 두 번째 회전에 대한 답은 첫 번째 회전을 실행한 다음, 그 상태에서 두 번째 회전을 실행했을 때 이동한 숫자 중 최솟값을 구하면 됩니다.

문제 풀이

문제를 분석해 본 결과 특정한 알고리즘을 쓰는 것이 아닌 구현 문제로 판단하여
4개의 for loop를 구현해서 한칸씩 옮기는 방법으로 접근
단, 한칸씩 옮기게 되면 마지막 값이 누락되게 때문에 처음 값을 temp에 넣고 마지막 값에 temp을 할당해주는 방법으로 구현

let arr = [];

function solution(rows, columns, queries) {
    let answer = [];
    
    
    let num = 1;
    for(let i = 0; i < rows; i++){
        arr[i] = [];
        for(let j = 0; j < columns; j++){
            arr[i][j] = num;
            num++;
        }
    }
    
    for(let i = 0; i < queries.length; i++){
        let r1 = queries[i][0]-1;
        let c1 = queries[i][1]-1;
        let r2 = queries[i][2]-1;
        let c2 = queries[i][3]-1;
        answer.push (rotation(r1,c1,r2,c2)) ;
    }
    
    
    return answer;
}

function rotation(r1,c1,r2,c2){
    //최소 값을 찾기 위해 또 다른 value배열을 생성
  	let value =[];
  	// 처음 값을 temp에 할당
    let temp = arr[r1][c1];
    value.push(arr[r1][c1]);
    
  	// 반시게 방향으로 한칸씩 밀어서 재배치
    for(let i = r1; i < r2; i++){
        arr[i][c1] = arr[i+1][c1];
        value.push(arr[i][c1]);
    }
    for(let i = c1; i < c2; i++){
        arr[r2][i] = arr[r2][i+1];
        value.push(arr[r2][i]);
    }
    for(let i = r2; i > r1; i--){
         arr[i][c2] = arr[i-1][c2];
        
        value.push(arr[i][c2]);
    }
    for(let i = c2; i > c1+1; i--){
        arr[r1][i] = arr[r1][i-1];
        value.push(arr[r1][i]);
    }
   // 마지막 값에 tmep를 할당
    arr[r1][c1+1] = temp;
    
  	// rows와 columns의 최대값이 각각 100이기 때문에 나올수 있는 최소값으 10000
    let min = 10001;
    
  	// value에 할당 되어 있는 값들의 전체를 비교하여 최소값을 찾는다.
    for(let i = 0; i < value.length; i++){
        if(min > value[i]){
            min = value[i];
        }
    }
    return min;
}

💡 문제 해결 과정 느낌점

처음 구현할때 r1,c1,r2,c2와 같은 변수를 따로 선언하지 않아 헷갈리는 부분도 많고 가독성도 떨어져서 문법 오류가 많이 나서 변수를 선언하였더니 오류가 더 잘 잡혔다. 특정 값이 고정되어 있을 경우에서 무조건적으로 변수 선언을 해야겠다고 생각하였다.

좋은 웹페이지 즐겨찾기