Programmers - 방문 길이

문제 설명

게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다.

  • U: 위쪽으로 한 칸 가기
  • D: 아래쪽으로 한 칸 가기
  • R: 오른쪽으로 한 칸 가기
  • L: 왼쪽으로 한 칸 가기

캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다. 좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다.

예시는 하단 링크를 참고 부탁드립니다.

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

문제 접근

방문했던 좌표를 시작점 - 끝점 그리고 끝점 - 시작점을 저장하여 중복되는 요소를 제거하면 진행한다.

  1. 현재 위치에서 그 다음 위치로 이동할때 그 다음 위치가 정해진 범위 내에 있는지를 확인한다.
  2. 정해진 범위 내에 있으면 시작점 - 끝점 그리고 끝점 - 시작점를 문자열로 Set 에 추가한다.
  3. 현재 위치를 업데이트한다.
  4. dirs 배열 길이만큼 위 과정을 반복한다.
  5. 마지막으로 결과는 Set 크기에 2로 나눈 몫 값을 반환한다.

    • 2로 나누는 이유: 시작점 - 끝점 과 끝점 - 시작점은 같은 것으로 판단하기 떄문이다.
function solution(dirs) {
    const moveList = new Set();
    const moveInfo = {
        U: [0, 1],
        D: [0, -1],
        R: [1, 0],
        L: [-1, 0],
    };
    
    let position = [0, 0];
    
    for (const dir of dirs) {
        const [directionX, directionY] = moveInfo[dir];
        const isRangeX = position[0] + directionX <= 5 && position[0] + directionX >= -5;
        const isRangeY = position[1] + directionY <= 5 && position[1] + directionY >= -5;
        
        if (isRangeX && isRangeY) {
            const startToEnd = `${position[0]}${position[1]}${position[0] + directionX}${position[1] + directionY}`;
            const endToStart = `${position[0] + directionX}${position[1] + directionY}${position[0]}${position[1]}`;
            
            moveList.add(startToEnd);
            moveList.add(endToStart);
            
            position[0] = position[0] + directionX;
            position[1] = position[1] + directionY;
        }
    }
    
    return moveList.size / 2;
}