[JavaScript][Programmers] 행렬 테두리 회전하기

조준형·2021년 8월 29일
0

Algorithm

목록 보기
91/142
post-thumbnail

🔎 행렬 테두리 회전하기

❓ 문제링크

https://programmers.co.kr/learn/courses/30/lessons/77485

📄 제출 코드

function solution(rows, columns, queries) {
  let map = [];
  makeMap(map, rows, columns);
  // console.log(map);
  var answer = [];
  for (let t=0; t < queries.length; t++) {
    const [x1, y1, x2, y2] = queries[t];
    // console.log(x1, y1, x2, y2);
    const stack = [];
    // 윗변 우로 +1
    for (let i = y1; i < y2; i++) stack.push(map[x1][i]);
    // 우변 아래로 +1
    for (let i = x1; i < x2; i++) stack.push(map[i][y2]);
    // 아래변 좌로 -1
    for (let i = y2; i > y1; i--) stack.push(map[x2][i]);
    // 좌변 위로 -1
    for (let i = x2; i > x1; i--) stack.push(map[i][y1]);

    // 정답 찾기
    answer.push(Math.min(...stack));
    
    // 가장 마지막에 한거 앞으로 보내기.
    stack.unshift(stack.pop());
    changeMap(map, [x1, y1, x2, y2], stack);
  }

  return answer;
}
function makeMap(map, rows, columns) {
  let num = 1;
  for (let i = 0; i <= rows; i++) {
    map[i] = [0, ];
    for (let j = 0; j < columns; j++) {
      if (i == 0) {
        map[i].push(0);
      } else {
        map[i].push(num);
        num++;
      }
    }
  }
}
function changeMap(map, [x1, y1, x2, y2], stack) {
  for (let i = y1; i < y2; i++) map[x1][i] = stack.shift();
  for (let i = x1; i < x2; i++) map[i][y2] = stack.shift();
  for (let i = y2; i > y1; i--) map[x2][i] = stack.shift();
  for (let i = x2; i > x1; i--) map[i][y1] = stack.shift();
}
let rows = 6;
let columns = 6;
let queries = [[2, 2, 5, 4], [3, 3, 6, 6], [5, 1, 6, 3]];
console.log(solution(rows, columns, queries));

처음에 돌릴부분의 최소값을 찾는 문제라 그냥 해당영역의 map에서 최소값만 구하면 되겠다 생각하고, 간단하다 생각했는데 그게 아니였다.
다음 쿼리에서는 처음 쿼리에서 변경된 값을 유지한상태에서 새로운 범위에서 숫자를 또 찾아야한다.
그래서 map을 이동 시키는 방법에 대해서 고민하다가 이부분을 해결하지 못해 다른사람의 코드를 보았다.

해결 방법은 stack을 이용한 방법이다.
먼저, map을 만드는데 queries의 2,2가 1부터 새는거라 map의 길이를 한 줄 더길게 해줘야했다.

6*6의 경우 목표 map
0	0	0	0	0	0	0
0	1	2	3	4	5	6
0	7	8	9	10	11	12
0	13	14	15	16	17	18
0	19	20	21	22	23	24
0	25	26	27	28	29	30
0	31	32	33	34	35	36

그 다음 윗변 부터 시계방향으로 해당하는 값들을 stack에 넣어준다.
(나는 다른 값을 넣을 때 기존 값에서 값을 더하거나 해서 map을 변경시켜야 겠다 생각하고, 한번에 map까지 바꾸는걸 생각해서 더 어려웠었던거 같다.)
최소값을 찾아 answer에 넣어두고, 담겨있는 stack을 출력해보면 처음 들어갈 값이 가장 마지막에 있는걸 볼 수 있다. 이 부분을 제일 앞으로 이동시켜주고 map을 변경시켜준다.
하나씩 shift해서 하나씩 값을 넣어준다.

📘 참고

https://velog.io/@tunakim/프로그래머스JS-행렬-테두리-회전하기

profile
깃허브 : github.com/JuneHyung

0개의 댓글