devych

about everything

CodeWars - Snail(달팽이) 알고리즘 풀이

2019-12-23 devychalgorithm

CodeWars Snail Algorithm

달팽이(Snail)알고리즘 문제는 n x n Array 를 인자로 받아 시계방향으로 순환하는 Array인자들을 순서대로 담아 Array형태로 return하는 형식의 문제이다. snail 그림을 클릭하면 Codewars Snail 알고리즘 문제 페이지로 이동합니다.

문제 접근 방식

이 문제를 풀기위해 나는 먼저 방문했던 인자의 좌표값을 Object에 저장해놓고, 지나갔던 좌표인지 아닌지를 확인하기로 했다.

또한 시계방향으로 순환하는 형식이기때문에 첫번째 인자 ([0,0])를 시작으로 오른쪽, 아래, 왼쪽, 위쪽으로 순환하는 함수를 제작했다.

예를 들어 3*3의 어레이가 주어졌을 경우, 첫 시작을 기준으로 오른쪽으로 가다가 ([0,2])좌표를 마지막으로 더 이상의 유효한 좌표가 없을 경우 아래로 향하도록 한다. 그리고 이 방식의 반복이다.

마지막으로 모든 좌표를 다 저장하면 Array를 Return 하면 문제가 끝난다.

Snail javascript 풀이 Code

snail = function(array) {
  let arrLen = array.length ** 2;
  let store = [];
  let coord = {};

  const isAvailableCoord = (x, y) => {
    return x >= 0 && y >= 0 && x < array.length && y < array.length && !coord[`x${x}y${y}`]
      ? true
      : false;
  };

  const saveCoord = (x, y) => {
    if (isAvailableCoord(x, y)) {
      store.push(array[x][y]);
      coord[`x${x}y${y}`] = "check";
    }
  };

  function goRight(x, y) {
    saveCoord(x, y);
    if (isAvailableCoord(x, y + 1)) {
      return goRight(x, y + 1);
    } else if (isAvailableCoord(x + 1, y)) {
      return goDown(x + 1, y);
    }
  }

  function goDown(x, y) {
    saveCoord(x, y);
    if (isAvailableCoord(x + 1, y)) {
      return goDown(x + 1, y);
    } else if (isAvailableCoord(x, y - 1)) {
      return goLeft(x, y - 1);
    }
  }
  function goLeft(x, y) {
    saveCoord(x, y);
    if (isAvailableCoord(x, y - 1)) {
      return goLeft(x, y - 1);
    } else if (isAvailableCoord(x - 1, y)) {
      return goUp(x - 1, y);
    }
  }
  function goUp(x, y) {
    saveCoord(x, y);
    if (isAvailableCoord(x - 1, y)) {
      return goUp(x - 1, y);
    } else if (isAvailableCoord(x, y + 1)) {
      return goRight(x, y + 1);
    }
  }

  if (array[0].length === 0) {
    return [];
  }

  goRight(0, 0);
  return store;
};

코드 개선 방안

  • 전체적으로 코드를 살펴보았을때 go*함수에서 반복되는 부분이 많이 보인다. 이 부분을 코드 스플릿을 통해 분리할 수 있겠다.