https://programmers.co.kr/learn/courses/30/lessons/49994
function solution(dirs) {
let move = { U: [0, 1], D: [0, -1], L: [-1, 0], R: [1, 0] };
let cur = [0, 0];
let route = new Set();
let answer = 0;
for (let i = 0; i < dirs.length; i++) {
let idx = dirs[i];
let nx = cur[0] + move[idx][0];
let ny = cur[1] + move[idx][1];
if (nx >= -5 && ny >= -5 && nx <= 5 && ny <= 5) {
route.add(`${cur[0]}${cur[1]}${nx}${ny}`);
route.add(`${nx}${ny}${cur[0]}${cur[1]}`);
cur = [nx,ny]
}
answer = route.size/2;
}
return answer;
}
let dirs = "ULURRDLLU";
console.log(solution(dirs));
처음에 10x10크기의 map을 그려서 UDLR에 따라 좌표를 이동해가면서 값을 찾으려고했는데 생각 하다보니까 굳이 map을 그릴것 까진 없을 거 같았다.
그래서 move에 대한 이동좌표값을 객체로 만들어 놓고, 좌표의 이동을 보려고했는데 중복체크를 어떻게 해야할지 고민이 였다.
고민을 하다가 다른사람의 코드를 보게되었는데 Set을 이용해 길이에 대한 두 점좌표를 저장해 중복을 체크 하는 것을 보았다.
(만약 0,0에서 U이면 위로 이동한 길은 [0,0][0,1]을 지났으니까 [0,1]에서 [0,0]으로 오는 것도 중복하면 안되기 때문에 0001, 0100 route에 넣어준다.)
dir만큼 반복하다가 map범위안이면 현재x,y이동x,y를 route에 저장.
이동x,y 현재x,y를 저장하고, 현재 좌표는 이동한 좌표로 변경한다.
반복을 완료하고, route에 저장할 당시 2번씩 저장했으니까 /2한 값으로 답을 도출하면 정답이 나온다.