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

bkboy·2022년 5월 2일
0

문제

게임 캐릭터를 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 이하의 자연수입니다.

입출력 예

풀이

function solution(dirs) {
  let arr = Array.from(Array(5), () => Array(5).fill(0));
  let count = 1;
  let current = [0, 0];
  for (let x of dirs) {
    if (x === 'U') {
      current[0]++;
    } else if (x === 'D') {
      current[0]--;
    } else if (x === 'R') {
      current[1]++;
    } else {
      current[1]--;
    }
    if (current[0] > 5) {
      current[0]--;
    }
    if (current[1] > 5) {
      current[1]--;
    }
    let tmp = current.slice();
    console.log(tmp);
    if (
      Math.abs(tmp[0]) <= 5 &&
      Math.abs(tmp[1]) <= 5 &&
      !arr[tmp[0]][tmp[1]]
    ) {
      arr[tmp[0]][tmp[1]] = 1;
      count++;
    }
  }

  return count;
}
  • 5x5 행렬을 만들어 0으로 초기화를 하고 지나간 좌표를 1로 바꿔주었다. 이걸 이용해 지나간 곳인지 아닌지를 확인했다.
  • 코드 실행은 무사히 통과했으나 제출하니 모든 케이스에서 런타임 에러가 나왔다.
function solution(dirs) {
  let move = { L: [-1, 0], R: [1, 0], U: [0, 1], D: [0, -1] };
  // 움직이는 명령은 객체를 이용했다.
  let now = [0, 0]; // current
  let route = new Set();

  for (let dir of dirs) {
    let nx = now[0] + move[dir][0]; // nextX
    let ny = now[1] + move[dir][1]; // nextY

    if (nx > 5 || nx < -5 || ny > 5 || ny < -5) continue;

    // route.add(`${now[0]}, ${now[1]} - ${nx}, ${ny}`); 이렇게 했는데 안됐다.
    // 이상하게 []형태로 넣으면 겹치는게 제거가 안된다.
    route.add('' + now[0] + now[1] + nx + ny);
    route.add('' + nx + ny + now[0] + now[1]);
    // 두개다 통과가 되어야 확실히 겹치지 않는 루트이기 떄문인가..?
    now = [nx, ny];
  }
  console.log(route);

  return route.size/2 ;
}
  • 객체를 활용한 테크닉을 기억해두자.
  • 겹치지 않아야하기 떄문에 set을 이용하는 것을 생각 할 수 있어야한다.
profile
음악하는 개발자

0개의 댓글