[프로그래머스/JS] 방문 길이

코린·2023년 11월 20일
0

알고리즘

목록 보기
44/44
post-thumbnail

문제

문제 풀이

이 문제는 다음으로 이동할 점이 이미 갔던 점!을 보는게 아니고
다음으로 이동할 점으로 갈 때 거쳐가는 선을 이용했냐 안했냐를 봐야합니다!

따라서 문제에서는 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;
}
profile
안녕하세요 코린입니다!

0개의 댓글