N

(프로그래머스 JS)방문 길이 본문

프로그래머스 알고리즘/2단계

(프로그래머스 JS)방문 길이

naeunchan 2022. 3. 14. 09:50
728x90
반응형

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

 

코딩테스트 연습 - 방문 길이

 

programmers.co.kr

Map을 활용하여 문제 풀이.

 

현재 좌표를 나타내는 x, y를 선언하고 5를 저장한다.

-5 ~ 5의 좌표를 가지는데 이를 보정하여 0 ~ 10의 좌표를 가지도록 한다.

그렇기 때문에 시작 좌표는 0, 0이 아닌 5, 5가 된다.

 

rangeCheck 함수는 들어온 인자(좌표)가 범위를 벗어나는지 확인한다.

범위를 벗어나면 0 또는 10을 리턴하여 움직이지 않도록 한다.

범위를 벗어나지 않는다면 그대로 x값을 리턴.

 

for문으로 dirs를 순회.

go, back 변수를 이용하여 이전에 방문한 적이 있는지 확인하기로 한다.

또한, cx와 cy를 선언하고 각각 x, y로 저장한다.

cx, cy는 현재 위치에서 움직였는지 확인하는 변수로 사용한다.

 

dirs[i]에 맞게 좌표를 움직이고,

cx, cy를 x, y와 비교하여, 움직임 여부를 확인한다.

만약 이전 좌표와 다르다면 움직였다는 뜻이므로 go와 back으로 방문 여부를 확인한다.

go와 back은 문자열 형태다.

go : [cx, cy] -> [x, y]로 움직인 적이 있는지 확인.

back : [x, y] -> [cx, cy]로 움직인 적이 있는지 확인.

이 두 값을 key로 가지는 값이 map에 있는지 확인한다.

없다면 answer++을 해주고, 두 값을 map에 저장한다.

있다면 아무런 행동도 하지 않으면 된다.

function solution(dirs) {
    let answer = 0;
    const map = new Map();
    const direct = [[-1, 0], [1, 0], [0, -1], [0, 1]];
    const queue = [];
    let x = 5;
    let y = 5;
    
    const rangeCheck = (x) => {
        if(x < 0){
            return 0;
        } else if(x > 10){
            return 10;
        }
        
        return x;
    }
    
    for(let i = 0; i < dirs.length; i++){
        let go = `${x}${y}`;
        let back = `${x}${y}`;
        const cx = x;
        const cy = y;
        
        if(dirs[i] === "U"){
            x = rangeCheck(x + direct[0][0]);
            y = rangeCheck(y + direct[0][1]);    
        } else if(dirs[i] === "D"){
            x = rangeCheck(x + direct[1][0]);
            y = rangeCheck(y + direct[1][1]);
        } else if(dirs[i] === "L"){
            x = rangeCheck(x + direct[2][0]);
            y = rangeCheck(y + direct[2][1]);
        } else if(dirs[i] === "R"){
            x = rangeCheck(x + direct[3][0]);
            y = rangeCheck(y + direct[3][1]);
        }
        
        if(cx !== x || cy !== y){
            go = `${go}${x}${y}`;
            back = `${x}${y}${back}`;

            if(!map.has(go) || !map.has(back)){
                answer++;
                map.set(go, true);
                map.set(back, true);
            }
        }
    }
    
    return answer;
}
728x90
반응형