fffo

방문 길이 본문

Programming/Algorithm

방문 길이

gggs 2021. 9. 29. 22:27

문제

문제 설명

게임 캐릭터를 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 함수를 완성해 주세요.

제한사항

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

입출력

dirs answer
"ULURRDLLU" 7
"LULLLLLLU" 7

입출력 설명

입출력 #1
문제의 예시와 같습니다.

입출력 #2
문제의 예시와 같습니다.

 

접근 및 풀이

map 자료구조는 키 값을 배열로 받을 수 있기 때문에 키 값으로 좌표, value로 이전 좌표들의 배열을 삽입해 풀려고 했다. 그러나 키 값으로 배열은 넣을 수 있었지만 get이나 has로 사용은 불가능 했다. 그래서 좌표 배열을 문자열로 바꿔서 해결했다.

 

코드

function solution(dirs) {
  
  const move = {
    U: [0, 1],
    D: [0, -1],
    R: [1, 0],
    L: [-1, 0]
  }

  let pathCount = 0;
  const map = new Map();
  let before = [0,0];

  dirs.split("").forEach(dir => {
    const position = {};
    const curX = before[0] + move[dir][0];
    const curY = before[1] + move[dir][1];
    const curPos = [curX, curY].toString();
    const beforePos = before.toString();
    if (curX > 5 || curY > 5 || curX < -5 || curY < -5) {
      return;
    }
    if (!map.has(curPos)){
      map.set(curPos, [beforePos]);
      if (map.get(beforePos) !== undefined){
        map.get(beforePos).push(curPos);
      } else {
        map.set(beforePos, [curPos]);
      }
      pathCount++;
    } else if (!map.get(curPos).includes(beforePos)){
      map.get(curPos).push(beforePos);
      map.get(beforePos).push(curPos);
      pathCount++;
    }
    before = [curX, curY];
  })
  return pathCount;
}

출처

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

'Programming > Algorithm' 카테고리의 다른 글

탐욕법(greedy) - 구명보트  (0) 2021.09.30
가장 큰 정사각형 찾기  (0) 2021.09.29
이진 변환 반복  (0) 2021.09.29
2개 이하로 다른 비트  (0) 2021.09.29
문자열 - 영어 끝말잇기  (0) 2021.09.28
Comments