본문 바로가기
일반 학습/코딩 테스트

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

by StelthPark 2022. 5. 2.

처리조건

풀이

기준 좌표를 [0,0]으로 잡고 전체 좌표 크기는 5X5이므로 현재 좌표에서 X,Y로 U,D,L,R에 따라 좌우상하로 1씩움직일때 좌표값 X,Y중 -5이상이며 5이하이어야한다. 만약 UDLR에 따라 움직인 좌표가 -5미만 5초과일 시 해당 명령어는 무시하게 된다. 또한 한번 이동한 구간, 예를 들어 [0,0]에서 [1,0]으로 이동하고 다시 [0,0]으로 이동하면 해당 구간은 서로간에 갔다,왔다 모두 간적 있는 거리라는 것 쉽게 생각하면 우리집에서 홈플러스 까지 동일한 길을 사용해서 갔다. 그럼 홈플러스에서 우리집까지도 동일한 길로 왔다는 가정하에 난 그 길을 가본적이 있다는 것이다.

 

받은 명령어 문자열을 for문으로 한글자 씩 명령어를 풀며 명령어마다 [0,0]을 기준으로 움직이기 시작하며 -5미만 5초과를 할시 해당 명령어는 continue로 다음 for문으로 넘긴다.

 

현재 좌표에서 내가 갈 좌표를 붙여서 일련의 거리코드문자열을 만들고 뒤집어 내가 갈 좌표에 현재 좌표를 붙여 일련의 거리 코드 문자열2를 만든다. 이는 위에서 설명한대로 오고가고 둘다 내가 간적이 있는 거리이기 때문이다.

 

현재 가본적 있던 거리를 저장하는 compareArr 배열에서 일련의 거리 코드문자열 1,2가 있는지 검사하고 없다면 현재 좌표에서 명령어에 따라 이동시켜준 뒤 compareArr에 이 일련의 거리 코드 문자열1,2를 담아준다. 그리고 실제 이동했으니 answer을 올린다.

 

여기 까지 작성한 코드 중 R처리만 보자면 아래와 같다

  let startXY = [0, 0];
  let compareArr = [];
  let answer = 0;
  for (let i = 0; i < dirs.length; i++) {
    let [x, y] = startXY;
    if (dirs[i] === "R") {
      let moveXY = String(x + 1) + String(y);
      let compareV1 = `${x}` + `${y}` + moveXY;
      let compareV2 = moveXY + `${x}` + `${y}`;
      if (startXY[0] + 1 > 5) continue;
      if (compareArr.includes(compareV1) === false && compareArr.includes(compareV2) === false) {
        startXY[0]++;
        compareArr.push(compareV1);
        compareArr.push(compareV2);
        answer++;
      } else {
        break;
      }
    }

 이렇게 작성하니 8번 부터 테스트케이스를 통과하지 못한다. 그 이유는 명령어를 돌다가 현재 명령어가 compareArr에 있는 간 적 있는 거리라면 그냥 for문을 종료하고 거기까지만 이동하게 되며 answer를 리턴하게 작성했다. 왜 이렇게 생각 했냐면

 

이렇게 ULURRDLLU 명령어에서 마지막 8,9 L,U에서 8번은 간적이 있고 9번도 간적 이 있다. 이 8,9를 처리하기전에 현재 게임 캐릭터는 [0,1]에 있고 8은 간적있고 그다음 처리인 9는 그럼 [0,2]이니 처리되어서 정상적으로 위로 올라가야한다고 생각했다. 또는 8번부터 끊겼으니 문제설명 예시에 의하면 8,9 모두 처리안되게 BREAK하거나..

 

그런데 해당 조건에서는 신기하게.. 일단 answer는 안올리더라도 8번으로 캐릭터는 이동시키고 9번을 이동시킬지 검사하라고 한다.. 이게 맞는건가? 문제가 조금 이상하다고 생각했다. 8번은 조건에 안맞아서 이동시키면 안되는데 이걸 이동시키고 9번을 이동시킬지 검사하라니.. 차라리 [0,1]에서 8번은 안되니 9번처리를 보자면 위로 한칸 올라가게 하던가..

 

그래서 break하지많고 answer만 안올리지 그냥 캐릭터는 이동시켜주는걸로 작성했다. 그랬더니 케이스를 모두 통과했다. 왔다갔다 모두 간적 있는 걸로 계산해야하는 조건은 잘 떠올렸으나 문제자체가 캐릭터가 이동할 수 없는 조건인데 굳이 이동시키고 실제 이동값은 안올린다? 이 부분이 굳이? 라는 생각이 더 많이 들었던거 같다.

 

function solution(dirs) {
  let startXY = [0, 0];
  let compareArr = [];
  let answer = 0;
  for (let i = 0; i < dirs.length; i++) {
    let [x, y] = startXY;
    if (dirs[i] === "R") {
      let moveXY = String(x + 1) + String(y);
      let compareV1 = `${x}` + `${y}` + moveXY;
      let compareV2 = moveXY + `${x}` + `${y}`;
      if (startXY[0] + 1 > 5) continue;
      if (compareArr.includes(compareV1) === false && compareArr.includes(compareV2) === false) {
        startXY[0]++;
        compareArr.push(compareV1);
        compareArr.push(compareV2);
        answer++;
      } else {
        break;
      }
    }

    if (dirs[i] === "L") {
      let moveXY = String(x - 1) + String(y);
      let compareV1 = `${x}` + `${y}` + moveXY;
      let compareV2 = moveXY + `${x}` + `${y}`;
      if (startXY[0] - 1 < -5) continue;
      if (compareArr.includes(compareV1) === false && compareArr.includes(compareV2) === false) {
        startXY[0]--;
        compareArr.push(compareV1);
        compareArr.push(compareV2);
        answer++;
      } else {
        startXY[0]--;
      }
    }
    if (dirs[i] === "U") {
      let moveXY = String(x) + String(y + 1);
      let compareV1 = `${x}` + `${y}` + moveXY;
      let compareV2 = moveXY + `${x}` + `${y}`;
      if (startXY[1] + 1 > 5) continue;
      if (compareArr.includes(compareV1) === false && compareArr.includes(compareV2) === false) {
        startXY[1]++;
        compareArr.push(compareV1);
        compareArr.push(compareV2);
        answer++;
      } else {
        startXY[1]++;
      }
    }
    if (dirs[i] === "D") {
      let moveXY = String(x) + String(y - 1);
      let compareV1 = `${x}` + `${y}` + moveXY;
      let compareV2 = moveXY + `${x}` + `${y}`;
      if (startXY[1] - 1 < -5) continue;
      if (compareArr.includes(compareV1) === false && compareArr.includes(compareV2) === false) {
        startXY[1]--;
        compareArr.push(compareV1);
        compareArr.push(compareV2);
        answer++;
      } else {
        startXY[1]--;
      }
    }
  }
  return answer;
}

댓글