[Level2] 방문길이




방문길이

프로그래머스

틀린 코드

function solution(dirs) {
  let x = 0;
  let y = 0;

  const dir = dirs.split('');

  let set = [];
  set.push(`${x}${y}`);

  for (let i = 0; i < dir.length; i++) {
    switch (dir[i]) {
      case 'U':
        x += 1;
        break;
      case 'D':
        x -= 1;
        break;
      case 'R':
        y += 1;
        break;
      case 'L':
        y -= 1;
        break;
    }
    if (x < -5 || x > 5 || y < -5 || y > 5) continue;
    if (!set.includes(`${x}${y}`)) set.push(`${x}${y}`);
  }
  return set.length;
}

에제는 통과 됐는데, 제출문제는 모든 것이 오류가 났다.
테스트케이스를 알 수 있으면 좋을텐데 도저히 어디가 문제인지를 찾지 못했다.ㅠ



정답 코드

function solution(dirs) {
  const move = { U: [1, 0], D: [-1, 0], L: [0, -1], R: [0, 1] };
  let set = new Set();
  let now = [0, 0];

  for (let i = 0; i < dirs.length; i++) {
    let nx = now[0] + move[dirs[i]][0];
    let ny = now[1] + move[dirs[i]][1];

    if (nx < -5 || nx > 5 || ny < -5 || ny > 5) continue;
    set.add('' + now[0] + now[1] + nx + ny);
    set.add('' + nx + ny + now[0] + now[1]);
    now = [nx, ny];
  }
  return set.size / 2;
}

접근 방식의 문제점을 깨달았다.
처음 코드는 내가 간 꼭지점 좌표만 기억해뒀다.
즉 예를 들어 1,1이 있다면 이게 왼쪽에서 온건지 오른쪽에서 온건지, 위인지, 아래인지를 몰랐던 것
그래서 온 경로로 기억시켰다.
경로는 0,0 에서 1,1 간 경로와 1,1에서 0,0으로 간 경로가 동일하기 때문에 둘 다 저장후 마지막을 2로 나누었다.
그리고 다른분의 코드를 보니 문자열 배열로 만들지 않고, 객체 key로 접근하는 좋은 방법이 있길래 활용했다!