반응형
문제가 길어서 예시 한 개는 넣지 않았습니다.
문제는 아래 링크에서 확인할 수 있습니다
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;
}