[백준14503_자바스크립트(javascript)] - 로봇 청소기

경이·2024년 8월 21일

𝑩𝑶𝑱 (𝒋𝒔)

목록 보기
150/325

🔴 문제

로봇 청소기


🟡 Sol

const fs = require('fs');
const path = process.platform === 'linux' ? '/dev/stdin' : 'Wiki\\input.txt';
const [_, rcd, ...inputs] = fs.readFileSync(path).toString().trim().split('\n');
const map = inputs.map((it) => it.split(' ').map(Number));
let [r, c, d] = rcd.split(' ').map(Number);
let ans = 0;

exit: while (true) {
  if (map[r][c] === 0) {
    map[r][c] = 2;
    ans += 1;
  }

  let flag = false;
  for (let i = 0; i < 4; i++) {
    d -= 1;
    if (d === -1) d = 3;
    if (d === 0) {
      nr = r - 1;
      nc = c;
    } else if (d === 1) {
      nr = r;
      nc = c + 1;
    } else if (d === 2) {
      nr = r + 1;
      nc = c;
    } else if (d === 3) {
      nr = r;
      nc = c - 1;
    }

    if (map[nr][nc] === 0) {
      r = nr;
      c = nc;
      flag = true;
      break;
    }
  }

  if (!flag) {
    for (let i = 0; i < 4; i++) {
      let nr;
      let nc;

      if (d === 0) {
        nr = r + 1;
        nc = c;
      } else if (d === 1) {
        nr = r;
        nc = c - 1;
      } else if (d === 2) {
        nr = r - 1;
        nc = c;
      } else if (d === 3) {
        nr = r;
        nc = c + 1;
      }

      if (map[nr][nc] === 1) {
        break exit;
      } else if (map[nr][nc] === 2 || map[nr][nc] === 0) {
        r = nr;
        c = nc;
        break;
      }
    }
  }
}

console.log(ans);

🟢 풀이

⏰ 소요한 시간 : 4시간(트루임)

일단 후진했을 때 벽이 나오기 전까지는 계속 반복해야한다. 따라서 while(true)로 시작

문제에서 주어진대로 현재 칸(r, c)가 청소되지 않은 경우 즉 0인경우 현재 칸을 청소(2로 변경)한다. 그리고 ans값을 1증가시켜서 청소된 칸을 카운팅 해준다.
그 이후로는 현재 칸 주변 4칸중 청소되지 않은 빈칸이 있는지 확인하기 위한 4번의 반복문을 수행한다.

주어진 요구사항 처럼 반시계방향으로 90도 회전처리한다. 회전처리는 d의 방향을 1로 빼줬다. 음수가 되는경우 3으로 바꿔주면 됨. 방향에 따라서 nrnc로 다음 좌표를 확인하고
해당 좌표가 0인경우 현재 위치를 다음좌표로 바꿔준다.
이 때 앞으로 전진을 한 경우 즉 4개의 방향중 청소하지 않은 빈칸이 있어 앞으로 전진할 수 있는경우 flagtrue로 바꿔준 후 반복을 종료한다. flagtrue라면 앞으로 전진을 한것이라 아래의 if문을 수행할 필요가 없다.
만약 4개의 방향을 모두 순회했는데 청소 되지 않은 빈칸이 없는 경우는 아래 로직을 수행해야한다.

바라보는 방향을 유지한채로 각 방향에 맞게 nrnc로 후진할 위치를 확인하고, 해당 좌표가 1인경우 종료한다. 이때 이름있는 반복문을 사용해서 바깥반복문을 빠져나갈 수 있도록 한다.
만약 해당 좌표가 1이 아닌 경우 rc를 현재 위치로 바꿔준 후 해당 위치에서 다시 주위 4칸을 확인해 빈칸이 있는지 확인할 수 있도록 한다.

푸는데 총 4시간이 걸렸고 뭐가 문제인지 몰라 유튜브로 풀이도 참고해보았는데 내가 짠 코드와 로직이 거의 비슷했다. (당연함 시뮬레이션이니까)
그래서 내가 오래걸린 이유를 찾아보니 문제를 제대로 이해하지 못했다는 것 ...
구현 -> 오류발견 -> 문제확인 -> 수정 -> 오류발견 -> 문제확인 과정이 계속 반복되었다는 것...

구현/시뮬레이션 문제를 잘 풀려면 수정하는 방법이 아니라 처음부터 완벽하게 문제를 이해하고 도식화해서 코드로 옮겨야 한다.


🔵 Ref

https://www.youtube.com/watch?v=0TAQwMYyNOQ

profile
록타르오가르

0개의 댓글