-
Section4 Daily Coding 02_robotPath공부/데일리코딩 2022. 7. 22. 09:19반응형
문제
세로와 가로의 길이가 각각 M, N인 방의 지도가 2차원 배열로 주어졌을 때, 1은 장애물을 의미하고 0 이동이 가능한 통로를 의미합니다. 로봇은 지도 위를 일분에 한 칸씩 상하좌우로 이동할 수 있습니다. 로봇의 위치와 목표 지점이 함께 주어질 경우, 로봇이 목표 지점까지 도달하는 데 걸리는 최소 시간을 리턴해야 합니다.
입력
인자 1 : room
- 배열을 요소로 갖는 배열
- room.length는 M
- room[i]는 number 타입을 요소로 갖는 배열
- room[i].length는 N
- room[i][j]는 세로로 i, 가로로 j인 지점의 정보를 의미
- room[i][j]는 0 또는 1
인자 2 : src
- number 타입을 요소로 갖는 배열
- src.length는 2
- src[i]는 0 이상의 정수
- src의 요소는 차례대로 좌표평면 위의 y좌표, x좌표
인자 3 : dst
- number 타입을 요소로 갖는 배열
- dst.length는 2
- dst[i]는 0 이상의 정수
- dst의 요소는 차례대로 좌표평면 위의 y좌표, x좌표
출력
- number 타입을 리턴해야 합니다.
주의사항
- M, N은 20 이하의 자연수입니다.
- src, dst는 항상 로봇이 지나갈 수 있는 통로입니다.
- src에서 dst로 가는 경로가 항상 존재합니다.
입출력 예시
let room = [ [0, 0, 0, 0, 0, 0], [0, 1, 1, 0, 1, 0], [0, 1, 0, 0, 0, 0], [0, 0, 1, 1, 1, 0], [1, 0, 0, 0, 0, 0], ]; let src = [4, 2]; let dst = [2, 2]; let output = robotPath(room, src, dst); console.log(output); // --> 8
Reference Code
const robotPath = function (room, src, dst) { const aux = (M, N, candi, step) => { // 현재 위치 const [row, col] = candi; // 배열의 범위를 벗어난 경우 if (row < 0 || row >= M || col < 0 || col >= N) return; if (room[row][col] === 0 || room[row][col] > step) { room[row][col] = step; } else { // 장애물(1)이거나 이미 최소 시간(1)으로 통과가 가능한 경우 return; } // dfs로 4가지 방향에 대해 탐색을 한다. // 완전탐색을 해야하므로 bfs나 dfs가 큰 차이가 없다. // bfs의 경우 목적지에 도착하는 경우 탐색을 중단해도 되므로, // 약간 더 효율적이다. aux(M, N, [row + 1, col], step + 1); // 상 aux(M, N, [row - 1, col], step + 1); // 하 aux(M, N, [row, col - 1], step + 1); // 좌 aux(M, N, [row, col + 1], step + 1); // 우 }; // 로봇이 서 있는 위치를 1로 초기화하면 (다시 방문하지 않기 위해서), // 바로 옆 통로는 2가 된다. // 계산이 완료된 후에 최종값에 1을 빼주면 된다. aux(room.length, room[0].length, src, 1); const [r, c] = dst; return room[r][c] - 1; };
반응형'공부 > 데일리코딩' 카테고리의 다른 글
Section4 Daily Coding 04_gossipProtocol (0) 2022.07.26 Section4 Daily Coding 03_LSCS (0) 2022.07.25 Section4 Daily Coding 01_radixSort (1) 2022.07.21 Section3 Daily Coding 18_mergeSort (1) 2022.07.18 Section3 Daily Coding 17_quickSort (1) 2022.07.15