[프로그래머스#JS] 행렬 테두리 회전하기

12512 단어 Level 2Level 2

문제

행렬 테두리 회전하기 https://programmers.co.kr/learn/courses/30/lessons/77485

해결

시계방향으로 이동하는 것을 구현하는게 관건인 문제였습니다. 행렬을 사용하면 간단하게 구현하지만 인덱스를 이용하여 구현해봤습니다.
[x1, y1], [x2, y2]에 해당하는 직사각형 둘레를 [x1, y1] 인덱스 부터 시계방향으로 한 바퀴 돈 값들을 stack에 넣었습니다.
이 상태에서 stack의 마지막 값을 맨 앞에 넣으면 [x1, y1] 칸에서 부터 시계방향으로 한 칸 이동한 값들의 배열이 됩니다.
해당하는 인덱스에 stack을 하나씩 shift()하여 새로운 배열을 만들어주면 회전하도록 구현이 가능합니다.

코드

function solution(rows, columns, queries) {
  const answer = [];
  let arr = Array.from(new Array(rows + 1), () =>
    new Array(columns + 1).fill(0)
  );

  // 숫자 채우기
  for (let i = 1; i <= rows; i++) {
    for (let j = 1; j <= columns; j++) {
      arr[i][j] = (i - 1) * columns + j;
    }
  }

  for (let tc = 0; tc < queries.length; tc++) {
    const [x1, y1, x2, y2] = queries[tc];
    const stack = [];
    // 맨 위 직사각형 고르기 x1은 행 고정, y1이 y2 직전까지 1씩 증가
    for (let i = y1; i < y2; i++) stack.push(arr[x1][i]);
    // 오른쪽 직사각형 고르기 y2는 고정, x1이 x2 직전까지 1씩 증가
    for (let i = x1; i < x2; i++) stack.push(arr[i][y2]);
    // 아래쪽 직사각형 고르기 x2는 고정, y2가 y1 직전까지 1씩 감소
    for (let i = y2; i > y1; i--) stack.push(arr[x2][i]);
    // 왼쪽 직사각형 고르기y1는 고정, x2가 x1 직전까지 1씩 감소
    for (let i = x2; i > x1; i--) stack.push(arr[i][y1]);

    // 정답 찾기
    answer.push(Math.min(...stack));
    const temp = stack.pop();
    stack.unshift(temp);

    for (let i = y1; i < y2; i++) arr[x1][i] = stack.shift();
    for (let i = x1; i < x2; i++) arr[i][y2] = stack.shift();
    for (let i = y2; i > y1; i--) arr[x2][i] = stack.shift();
    for (let i = x2; i > x1; i--) arr[i][y1] = stack.shift();
  }

  return answer;
}

좋은 웹페이지 즐겨찾기