Home 프로그래머스 - 행렬 테두리 회전하기 Javascript
Post
Cancel

프로그래머스 - 행렬 테두리 회전하기 Javascript

행렬 테두리 회전하기

문제 설명

rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, 그 의미는 다음과 같습니다.

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

다음은 6 x 6 크기 행렬의 예시입니다.

https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/ybm/4c3c0fab-11f4-43b6-b290-6f4017e9379f/grid_example.png

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

https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/ybm/962df137-5c71-4091-ad9f-8e322910c1ab/rotation_example.png

행렬의 세로 길이(행 개수) 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입니다.
    • 모든 회전은 순서대로 이루어집니다.
    • 예를 들어, 두 번째 회전에 대한 답은 첫 번째 회전을 실행한 다음, 그 상태에서 두 번째 회전을 실행했을 때 이동한 숫자 중 최솟값을 구하면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
function solution(rows, columns, queries) {
  var answer = [];
  //2차원 배열 생성
  let arr = Array.from(new Array(rows + 1), () => new Array(columns + 1));

  let idx = 0;
  //배열에 값 집어 넣기
  for (let i = 1; i <= rows; i++) {
    for (let j = 1; j <= columns; j++) {
      arr[i][j] = ++idx;
    }
  }
  //stack
  for (let q of queries) {
    //[2,2,5,4] x1,y1,x2,y2
    let [x1, y1, x2, y2] = q;
    let stack = [];

    //맨 위, 행 고정
    for (let i = y1; i < y2; i++) {
      stack.push(arr[x1][i]);
    }
    //오른쪽,열 고정
    for (let i = x1; i < x2; i++) {
      stack.push(arr[i][y2]);
    }

    //맨 밑, 행 고정
    for (let i = y2; i > y1; i--) {
      stack.push(arr[x2][i]);
    }
    //왼쪽, 열 고정
    for (let i = x2; i > x1; i--) {
      stack.push(arr[i][y1]);
    }
    //최소값
    answer.push(Math.min(...stack));
    let first = stack.pop();
    stack.unshift(first);
    //stack에서 꺼내서 배열 값 바꾸기

    //맨 위, 행 고정
    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;
}
This post is licensed under CC BY 4.0 by the author.

프로그래머스 - 짝지어 제거하기 Javascript

프로그래머스 - 튜플 Javascript