본문 바로가기
개발/알고리즘

[프로그래머스][LEVEL2] 방문 길이

by ISA(류) 2021. 10. 7.

# 문제 원문

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

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

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

 

이때, 우리는 게임 캐릭터가 지나간 길 중 캐릭터가 처음 걸어본 길의 길이를 구하려고 합니다.

단, 좌표평면의 경계를 넘어가는 명령어는 무시합니다.

 

명령어가 매개변수 dirs로 주어질 때, 게임 캐릭터가 처음 걸어본 길의 길이를 구하여 return 하는 solution 함수를 완성해 주세요.

제한사항

  • dirs는 string형으로 주어지며, 'U', 'D', 'R', 'L' 이외에 문자는 주어지지 않습니다.
  • dirs의 길이는 500 이하의 자연수입니다.

입출력 예

dirs / answer

"ULURRDLLU" 7
"LULLLLLLU" 7

 

# 문제 풀이

 

정해진 구역 2차원 배열에서 이동 하는 경로를 구하는 문제이다. 간단한 문제로. 중복으로 지나간 영역과 영역을 벗어난 이동은 체크하지 않으므로, x,y 좌표을 가감하면서 해당 부분만 신경 써주면 된다. -5와 5을 벗어나는 명령들은 모두 무시하고, xy의 시작점과 끝점을 체크해서 같은 경로를 제외한 경로들을 카운팅해주면 되는 문제이다. 편의를 위해서 Set구조를 활용했다.

 

# 솔루션 플로우

1. 플레이어의 위치 x,y를 표현한 1차원 배열 xy를 선언한다.

2. 입력 받은 dirs 각 action을 모두 순회한다.

3. action전의 xy좌표를 state에 저장하고 action을 수행 했을시 정해진 맵을 벗어나지 않는다면 xy를 수정해준다.

4. state와 xy가 다르다면 이동한 경로를 Set에 정렬해서 저장한다.

5. Set에 저장 된 경로의 갯수를 카운팅해서 result를 얻는다.

6. 구해진 result를 반환한다.

1. Set & 반복문을 활용한 풀이

function solution(dirs) {
    const result = new Set();
    const xy = [0, 0];

    Array.from(dirs).forEach((action) => {
        const state = Array.from(xy);

        if (action === "U" && xy[1] < 5) {
            xy[1]++;
        }
        if (action === "D" && xy[1] > -5) {
            xy[1]--;
        }
        if (action === "R" && xy[0] < 5) {
            xy[0]++;
        }
        if (action === "L" && xy[0] > -5) {
            xy[0]--;
        }

        if (state.join(',') !== xy.join(',')) result.add([state.join(','), xy.join(',')].sort().join(':'));
    });

    return result.size;
}
반응형