CodeWars - Snail(달팽이) 알고리즘 풀이
CodeWars Snail Algorithm
달팽이(Snail)알고리즘 문제는 n x n Array 를 인자로 받아 시계방향으로 순환하는 Array인자들을 순서대로 담아 Array형태로 return하는 형식의 문제이다.
그림을 클릭하면 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*함수에서 반복되는 부분이 많이 보인다. 이 부분을 코드 스플릿을 통해 분리할 수 있겠다.