- 문제
- M x N 의 matrix에서 시작점에서 목표까지의 최소 이동시간을 리턴하라
- 1은 장애물, 0은 이동 가능한 통로를 의미
- 로봇은 1분에 한칸씩 이동할 수 있음
- 시도
- 이동할 수 있는 경우의 수를 구하고
- 모든 경우의 수를 이동하며, 카운팅한 값을 결과 배열에 저장하고
- 그 중 가장 작은 값을 리턴하는 식으로 구상하였음
- 문제를 이해하고, 위의 방식으로 수도코드를 구현하다가 해결방법에서 멀어진다고 느끼고
- 다른 방향을 고민하다가 시간 초과하였음
- 지뢰 찾기 게임과 비슷한 방식으로 문제를 해결해보자
- 최초에, 주어진 매트릭스에서 1로 표시한 장애물 값을 임의의 텍스트로 교체하고
- 시작점에서 멀어질 때마다 위치의 값을 이전 값 + 1로 바꾸는 식으로 전체 배열의 0 값을 바꾸고
- 바꾸는 도중 0이 아닌 값과 마주치면 바꿀 값과 현재의 값 중 작은 값으로 변경
- 모든 배열을 다 바꾼 후 도착 지점의 결과 값을 리턴하는 식으로 구현해보자
- 아래까지 짜보고, 방법이 잘못되었음을 깨닫고 결국 레퍼런스를 보고 이해하기로 하였음
- 시도
const robotPath = function (room, src, dst) {
for (let i = 0; i < room.length; i++) {
for (let j = 0; j < room[i].length; j++) {
if (room[i][j] === 1) {
room[i][j] = '';
}
}
}
let [r,c] = src;
room[r][c] = 's';
let cnt = 0;
};
- 레퍼런스
const robotPath = function (room, src, dst) {
const stepper = (m, n, now, step) => {
const [r, c] = now;
if (r < 0 || r >= m || c < 0 || c >= n) return;
if (room[r][c] === 0 || room[r][c] > step) {room[r][c] = step;}
else {return;}
stepper(m, n, [r + 1, c], step + 1);
stepper(m, n, [r - 1, c], step + 1);
stepper(m, n, [r, c + 1], step + 1);
stepper(m, n, [r, c - 1], step + 1);
};
stepper(room.length, room[0].length, src, 1);
const [row, col] = dst;
return room[row][col] - 1;
}