Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

개발의변화

프로그래머스 LV2 방문길이 본문

알고리즘

프로그래머스 LV2 방문길이

refindmySapporo 2023. 3. 28. 14:46
반응형

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제:

문제 설명

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

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

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

예를 들어, "ULURRDLLU"로 명령했다면

  • 1번 명령어부터 7번 명령어까지 다음과 같이 움직입니다.
  • 8번 명령어부터 9번 명령어까지 다음과 같이 움직입니다.

이때, 우리는 게임 캐릭터가 지나간 길 중 캐릭터가 처음 걸어본 길의 길이를 구하려고 합니다. 예를 들어 위의 예시에서 게임 캐릭터가 움직인 길이는 9이지만, 캐릭터가 처음 걸어본 길의 길이는 7이 됩니다. (8, 9번 명령어에서 움직인 길은 2, 3번 명령어에서 이미 거쳐 간 길입니다)

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

예를 들어, "LULLLLLLU"로 명령했다면

  • 1번 명령어부터 6번 명령어대로 움직인 후, 7, 8번 명령어는 무시합니다. 다시 9번 명령어대로 움직입니다.

이때 캐릭터가 처음 걸어본 길의 길이는 7이 됩니다.

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

 

해설:
const solution = (dirs) => {
        const set = new Set(); // 지나친 경로 배열(중복x)
        const [min, max] = [-5, 5]; // x, y좌표의 최소, 최대값
        let curX = 0; // x좌표
        let curY = 0; // y좌표
        let prev = ""; // 바뀌기전 경로

        for (let i = 0; i < dirs.length; i++) {
          prev = "" + curX + curY; // [0, 0] => '00' string으로 저장.
          if (dirs[i] === "U" && curY + 1 <= max) { // Y좌표 증가
            curY++;
          } else if (dirs[i] === "D" && curY - 1 >= min) { // Y좌표 감소
            curY--;
          } else if (dirs[i] === "R" && curX + 1 <= max) { // X좌표 증가
            curX++;
          } else if (dirs[i] === "L" && curX - 1 >= min) { // X좌표 감소
            curX--;
          } else { // 범위를 벗어나면 continue.
            continue;
          }

          // [0, 0] => [0, 1] 로 이동 했다면 '0001', '0100' 양방향 경로저장.
          set.add(curX + (curY + prev)); 
          set.add(prev + curX + curY);
        }

        return set.size / 2; // 양방향경로가 저장되어있으므로 size / 2.
      };
 
반응형