본문 바로가기
Algorithm/프로그래머스

Level3. 프로그래머스 방문 길이 - JavaScript

by 강깅꽁 2020. 10. 30.
반응형

 

문제가 길어서 예시 한 개는 넣지 않았습니다.

문제는 아래 링크에서 확인할 수 있습니다

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

 

 

문제 접근

 

문제를 보면 이동 시키는 건 간단하지만 같은 경로인지 판별하는게 까다로워 보입니다. 

우선, 이동할 수 있는 최대 위치는 x좌표 5와 -5 y좌표 5와 -5지점 입니다.

이 안에서는 자유롭게 이동가능합니다.

이동 경로를 파악하기 위해 경로를 object의 key값으로 설정했습니다.

key 값은 xy좌표 to 다음 xy좌표로 만들었습니다. 

즉 U 명령으로 (0,0)에서 (1,0)으로 이동했다면 경로 key값은 0,0 to 1,0이 됩니다.

여기서 문제는 UD이라는 명령일 때 같은 경로를 공유 합니다.

예를 들어, 좌표 (0,0)에서 시작해 U 명령으로 (1,0)으로 이동하고 D 명령으로 (1,0)에서 (0, 0)으로 이동하면 캐릭터는 같은 경로를 지난 것입니다. 

즉 0,0 to 1,0 이나 1,0 to 0,0이나 같은 경로를 지나게 되는 것이기 때문에 캐릭터가 지나는 경로를 object에 저장할 때 이를 고려해서 저장해야 합니다. 

 

코드가 아닌 말로 절차를 나타내면 다음과 같습니다.


명령 하나씩 실행 
해당 명령이 범위 안에 없으면 무효 
범위 안에 있으면 실행 
이동 하면 이동 경로를 object에 기록 (*역으로 갈 때에도 같은 경로)
object key의 갯수를 리턴

function solution(dirs) {
    var answer = 0;
    const defaultLocation = {x: 0, y: 0};
    const path ={};
    for( let move of dirs ) {
        let currentLocation = `${defaultLocation.x}${defaultLocation.y}`;
        switch( move ) {
            case "U": 
                if( defaultLocation.x + 1 <= 5 ) defaultLocation.x += 1;
                break;
            case "D": 
                if( defaultLocation.x - 1 >= -5 ) defaultLocation.x -= 1;
                break;
            case "R": 
                if( defaultLocation.y + 1 <= 5 ) defaultLocation.y += 1;
                break;
            case "L": 
                if( defaultLocation.y - 1 >= -5 ) defaultLocation.y -= 1;
                break;
        }
        let movedLocation = `${defaultLocation.x}${defaultLocation.y}`;
        if( currentLocation === movedLocation )  continue;
        else {
            const resultLocation = currentLocation+' to '+movedLocation;
            const reverseLocation = movedLocation+' to '+currentLocation;
            if ( path[resultLocation] !== 1 && path[reverseLocation] !== 1) path[resultLocation] = 1; 
        }
    }
    answer = Object.keys(path).length;
    return answer;
}