function isValidPosition(x, y) {
if(x < -5 || x > 5) return false;
if(y < -5 || y > 5) return false;
return true;
}
function solution(dirs) {
let result = '';
let routeSet = new Set();
let [curX, curY] = [0, 0];
const moveObj = {
U: [0, 1],
D: [0, -1],
L: [-1, 0],
R: [1, 0],
};
let curState = '';
let [moveX, moveY] = [0, 0];
let [nextX, nextY] = [0, 0];
for(let i=0; i<dirs.length; i+=1) {
curState = `${curX}${curY}`;
[moveX, moveY] = moveObj[dirs[i]];
[nextX, nextY] = [curX + moveX, curY + moveY];
if(isValidPosition(nextX, nextY)) {
curState += `${nextX}${nextY}`;
routeSet.add(curState);
curState = `${nextX}${nextY}${curX}${curY}`;
routeSet.add(curState);
[curX, curY] = [nextX, nextY];
}
else {
nextX = curX;
nextY = curY;
continue;
}
}
result = routeSet.size / 2;
return result;
}
const dirs = 'ULURRDLLU';
const result = solution(dirs)
console.log(result);
문제 그대로 구현하면 되는 문제였다.
하지만 이동경로를 저장해야하므로 문자열로 붙여서 Set에 넣어주었다. 예를들면 [0, 0]에서 [1, 0]으로 간다고 하면, 모든 좌표를 붙여서 0010 이라는 문자열을 Set에 넣어주었다.
그리고 어디서 출발해서 어디에 도착했는지를 중복검사 할 것이 아니라, 경로에 대한 중복검사를 해주어야한다.
[0,0] 에서 [1,0]으로 가는 것과 [1,0]에서 [0,0]으로 가는 것은 같은 경로라는 것이다.
따라서 Set에 넣어줄때 반대로 가는 경로 또한 넣어주고, 경로의 개수를 세는 것이므로 Set에 저장되어 있는 길이의 반을 반환해주었다.
'PS > Programmers' 카테고리의 다른 글
Programmers / Level 2 / 삼각 달팽이 / JS (0) | 2023.02.01 |
---|---|
Programmers / Level 2 / 모음사전 / JS (0) | 2023.01.31 |
Programmers / Level 2 / 할인 행사 / JS (0) | 2023.01.28 |
Programmers / Level 2 / 연속 부분 수열 합의 개수 / JS (0) | 2023.01.27 |