나선형 글자 추출 / 이중 배열

lim1313·2021년 10월 9일
0

문제

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

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

해결

const spiralTraversal = function (matrix) {
  let breakpoint = 0;
  let x = [0, 1, 0, -1];
  let y = [1, 0, -1, 0];
  let xyOrder = 0;
  let [dx, dy] = [0, 0];
  let answer = matrix[dx][dy];

  const isValid = (rx, cy) =>
    rx >= 0 && cy >= 0 && rx <= matrix.length - 1 && cy <= matrix[0].length - 1;

  const visited = Array.from({ length: matrix.length }, () =>
    Array(matrix[0].length).fill(0)
  );

  visited[dx][dy] = 1;

  function repeat(repeatLen, idxK) {
    if (breakpoint === 2) return;

    for (let i = 0; i < repeatLen; i++) {
      let [nx, ny] = [dx + x[idxK], dy + y[idxK]];

      if (isValid && visited[nx][ny]) {
        breakpoint++;
        break;
      } else {
        breakpoint = 0;
        [dx, dy] = [nx, ny];
        visited[dx][dy] = 1;
        answer += matrix[dx][dy];
      }
    }

    idxK = (idxK + 1) % 4;
    if (idxK === 0 || idxK === 2) repeat(matrix[0].length - 1, idxK);
    else repeat(matrix.length - 1, idxK);
  }

  repeat(matrix[0].length - 1, xyOrder);
  return answer;
};

다차원 배열 만들기 / 이중 배열

방법1

const arr1 = Array.from(Array(rows), () => new Array(columns));

const visited = Array.from(Array(matrix.length), () => new Array(matrix[0].length).fill(0));

방법2

Array(9).fill().map(()=>Array(9).fill())

방법3

Array.from({length: 20}, () => Array(10).fill(0))
//TODO 이중배열 만들기
{
  let max = 3;
  let matrixArr1 = Array.from(Array(max), () => Array(max).fill(0));
  let matrixArr2 = Array.from({ length: max }, () => Array(max).fill(0));
  let matrixArr3 = Array(max).fill(Array(max).fill(0));
}
profile
start coding

0개의 댓글