본문 바로가기

프로그래머스/구현

[구현] 프로그래머스 '행렬 테두리 회전하기' - js

반응형

1. 문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

2. 코드

문제 설명에 있던 이 부분은 분명 문제 풀 때 쓰일 것 같더니, 각 배열 요소에 자리에 맞는 값을 넣어줄 때 사용하라는 힌트였다.

길이가 100까지로 제한되어 있으니, 직접 배열을 만들어 숫자를 옮겨주는 방식을 사용해도 되었던 문제다. 괜히 타임아웃 뜰까봐 배열 만들까말까 우물쭈물 망설였네^^7 머쓱...

function solution(rows, columns, queries) {
  const answer = [];
  // 숫자가 1부터 시작하므로 +1 씩 더한 만큼의 배열 길이로 세팅
  let arr = Array.from({length : 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 el = 0; el < queries.length; el++) {
    const [x1, y1, x2, y2] = queries[el];
    const 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));
    // x1,y1에 stack의 가장 마지막 값 먼저 넣어주기
    const temp = stack.pop();
    stack.unshift(temp);
    // 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;
}

 

이해에 도움이 된 블로그)

https://velog.io/@tunakim/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4JS-%ED%96%89%EB%A0%AC-%ED%85%8C%EB%91%90%EB%A6%AC-%ED%9A%8C%EC%A0%84%ED%95%98%EA%B8%B0

 

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

행렬 테두리 회전하기 https://programmers.co.kr/learn/courses/30/lessons/77485시계방향으로 이동하는 것을 구현하는게 관건인 문제였습니다. 행렬을 사용하면 간단하게 구현하지만 인덱스를 이용하여 구현

velog.io

 

복기

7/5
반응형