본문 바로가기

코딩테스트/Programmers

[JS] 방문 길이

<문제>

https://school.programmers.co.kr/learn/courses/30/lessons/49994

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

< 풀이 >

function changeLocation(x,y,dir){
    switch(dir){
        case 'U':
            return [x,y+1];
        case 'D':
            return [x,y-1];
        case 'R':
            return [x+1,y];
        case 'L':
            return [x-1,y];
    }
}

function solution(dirs) {
    var answer = 0;
    let visited = new Set();
    
    let x=0;
    let y=0;
    
    for(let i=0;i<dirs.length;i++){
        const [nx,ny] = changeLocation(x,y,dirs[i]);
        if(nx<-5 || nx>5 || ny<-5|| ny>5)
            continue;
        
        visited.add(`${x}${y}${nx}${ny}`);
        visited.add(`${nx}${ny}${x}${y}`);
        
        x=nx;
        y=ny;
    }
    
    answer = visited.size/2;
    return answer;
}

✏️ 풀이 방법

1. 해당하는 문자에 따라 좌표 방향을 지정해주는 changeLocation 함수를 정의한다.

2. 방문한 곳을 저장하기 위해 visited 변수를 set 으로 정의한다. (중복되지 않게 하기 위함)

3. dirs 를 반복문을 돌면서, changeLocation 함수를 통해 nx 와 ny 에 이동한 좌표의 값을 저장한다.

3-1. 이동한 좌표가 좌표평면의 경계를 넘어갈 경우에는 다음 반복문으로 넘어간다.(명령어 무시)

3-2. 경계를 넘어가지 않을 경우에는 visited 에 이동한 경로를 저장한다.(방향성이 없기 때문에 x,y => nx,ny / nx,ny => x,y 두 경우 모두를 저장한다.)

3-3. 이동을 했으므로 x와 y 좌표의 값을 nx 와 ny 로 변경한다.

4. visited 에는 중복되지 않은 경로가 저장이 된다. 경로는 같지만 방향이 다른 2가지 경우를 모두 저장했으므로 최종 답은 visited.size/2 한 값이 정답(처음 걸어본 길의 길이) 이 된다. 

 

✍🏻 느낀점

처음에 set 을 사용하는 것까지는 생각했지만,  중복되는 지점을 어떻게 계산할 것인지 그리고 set 에 배열을 저장하는 식으로 문제를 풀어서 set 이 내가 원하는대로 동작하지 않았다. 이번 문제를 통해 처음 알게 된 것인데, set 에 객체를 넣게 될 경우에는 중복 체크가 제대로 되지 않는다고 한다. 이 이유는 자바스크립트의 객체는 참조 타입이므로 원시 타입과 다르게 비교할 때 값이 아닌 메모리 주소를 따지기 때문이다. 문제 자체는 이해하는 데 어렵지 않았는데 사소한 부분들 하나 하나 때문에 막혔던 것 같다. 이번 문제를 통해 변수를 문자열 식으로 변환해서  set 에 어떻게 저장하는지도 배웠으니 다음에 비슷한 문제가 나오면 이를 잘 활용해봐야겠다.