토이 23번

야 나 개 ·2021년 12월 13일
0

주간 문제아이돌 

목록 보기
16/17

문제

2차원 M x N 배열을 나선형(spiral)으로 순회

예제

let matrix = [
  ['A', 'B', 'C'],
  ['D', 'E', 'F'],
  ['G', 'H', 'I'],
];
let output = spiralTraversal(matrix);
console.log(output); // --> 'ABCFIHGDE'

문제는 이해 했는데..
어떻게 해야할지 모르겠다....벽이 느껴짐

차분하게 생각을 해보자

1단계
0번째 행부터 탐색을 하고
탐색하고 난건 false로 바꾸자

2단계
탐색을 2차원 배열의 요소의 개수만큼만 반복하자
탐색을 한번할때 마다 카운터를 해주고
총 요소의 개수는 가로 * 세로로 한다.

3단계....

정답코드

const spiralTraversal = function (matrix) {

  // 각 방향마다 row와 col의 변화를 저장
  const RIGHT = [0, 1];
  const DOWN = [1, 0];
  const LEFT = [0, -1];
  const UP = [-1, 0];
  // 각 방향을 위한 lookup table
  const MOVES = [RIGHT, DOWN, LEFT, UP];
  const M = matrix.length;
  const N = matrix[0].length;
  const isValid = (row, col) => row >= 0 && row < M && col >= 0 && col < N;

  let cnt = 0;
  let row = 0,
     col = -1;
  let direction = 0;
  let result = '';
  while (cnt < M * N) {
    const move = MOVES[direction];
    const [rd, cd] = move;

    row = row + rd;
    col = col + cd;
    while (isValid(row, col) && matrix[row][col] !== false) {
      result = result + matrix[row][col];
      // 한 요소를 두 번 접근하지 않게 하기 위해서, 접근된 요소를 false로 변경한다.
      matrix[row][col] = false;
      row = row + rd;
      col = col + cd;
      cnt++;
    }
    // row, col 이 행렬의 범위를 벗어났기 때문에,
    // 진행된 방향의 반대로 한 칸 이동한다.
    row = row - rd;
    col = col - cd;

    // 각 방향이 순환되기 때문에 모듈러 연산을 사용한다.
    direction = (direction + 1) % 4;
  }
  return result;
};
profile
야 나도 개발자 될 수 있어

0개의 댓글