이 문제는 다음으로 이동할 점이 이미 갔던 점!을 보는게 아니고
다음으로 이동할 점으로 갈 때 거쳐가는 선을 이용했냐 안했냐를 봐야합니다!
따라서 문제에서는 x는 -5부터 5까지 y는 -5 부터 5까지의 좌표평면이 주어졌지만 우리는 더 크게 봐야합니다.
위 그림처럼 각 점 뿐만 아니라 빨간선까지 포함하는 이차원 배열을 만들어주어야 합니다.
x가 -1 부터 1 y가 -1 부터 1 이라면
5*5 의 이차원 배열을 생성하면 됩니다.
그럼 우리의 경우
21*21 형태의 배열을 만들어주면 됩니다.
그리고 시작점은 (5,5)이므로 사실상 우리 코드에서 시작점은 (10,10) 이 됩니다.
점으로 이동할 때는 2칸씩 이동해서 봐주어야하며
선이 이미 지나간 선인지 판단할 때는 1씩 이동해서 봐줘야 합니다.
//움직이는 방향 설정
let dir= {'U':[0,1],'D':[0,-1],'R':[1,0],'L':[-1,0]};
방향을 위와 같이 설정해서 점으로 이동할 때는 *2 해주었습니다.
function solution(dirs) {
var answer = 0;
//움직이는 방향 설정
let dir= {'U':[0,1],'D':[0,-1],'R':[1,0],'L':[-1,0]};
//배열의 크기
let visited = Array.from(Array(21),()=>Array(21).fill(0));
//시작점 설정
let x = 10,y=10;
for(let i=0;i<dirs.length;i++){
//점을 이동시킴
let nx = x + ((dir[dirs[i]][0])*2);
let ny = y + ((dir[dirs[i]][1])*2);
//범위 벗어나는 경우는 보지 않음
if(nx < 0 || ny < 0 || nx >= 21 || ny >= 21) continue;
//선을 지나갔나 확인
let dx = x + dir[dirs[i]][0];
let dy = y + dir[dirs[i]][1];
x = nx,y=ny;
//이미 사용한 선이면 세주지 않음
if(visited[dy][dx]!=0) continue;
//안 쓴 선이면 세어주고 지나간 선임을 표시해줌
visited[dy][dx] = 1;
answer++;
}
return answer;
}