[Toy Problem] spiralTraversal

황순은·2021년 11월 5일
0

Algorithm

목록 보기
15/16
post-thumbnail

문제 설명

2차원 M x N 배열을 나선형(spiral)으로 순회해야 합니다.

입력

인자 1 : matrix

  • 세로 길이(matrix.length)가 M, 가로 길이(matrix[i].length)가 N인 2차원 배열
  • matrix[i]string 타입을 요소로 갖는 배열
  • matrix[i][j].length는 1

출력

  • string 타입을 리턴해야 합니다.

주의사항

  • 순회는 좌측 상단 (0,0)에서 시작합니다.
  • 배열의 모든 요소를 순서대로 이어붙인 문자열을 리턴해야 합니다.

입출력 예시

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

matrix = [
  ['T', 'y', 'r', 'i'],
  ['i', 's', 't', 'o'],
  ['n', 'r', 'e', 'n'],
  ['n', 'a', 'L', ' '],
];
output = spiralTraversal(matrix);
console.log(output); // --> 'Tyrion Lannister'

Solution

  1. 오른쪽 -> 아래 -> 왼쪽 -> 위 순으로 반복적으로 이루어지는 작업이므로 MOVES에 이동좌표를 순서대로 넣어준다.
  2. while문시작 (answer가 matrix의 행 * 열과 같아지면 리턴)
    2-1 다음 좌표의 값이 false이거나 matrix의 범위를 넘어설 경우 방향을 틀어준다.
  3. answer를 리턴.
const spiralTraversal = function (matrix) {
  const R = matrix.length
  const C = matrix[0].length
  let MOVES = [
    [0, 1],
    [1, 0],
    [0, -1],
    [-1, 0]
  ]
  const isValid = (r, c) => r < R && r >= 0 && c < C && c >= 0
  let answer = matrix[0][0]
  matrix[0][0] = false
  let dir = 0
  let row = 0
  let col = 0
  while (answer.length < R * C) {
    const [nextR, nextC] = MOVES[dir]
    const r = row + nextR
    const c = col + nextC
    if (isValid(r, c) && matrix[r][c]) {
      row = r
      col = c
      answer += matrix[row][col]
      matrix[row][col] = false
    } else {
      dir++
      if (dir > 3) dir = 0
    }
  }
  return answer
};

GItHub repo

profile
안녕하세요.

0개의 댓글