[JavaScript] 프로그래머스 경주로 건설 LEVEL3
9977 단어 JavaScriptBFS/DFS프로그래머스BFS/DFS
const [dx, dy] = [[0, 0, -1, 1], [-1, 1, 0, 0]]; // 상 하 좌 우
const bfs = (board) => {
const n = board.length;
const visit = Array.from(Array(n), () => new Array(n).fill(0));
const queue = [[0, 0, 0, 0]]; // x, y, 현재까지 비용, 방향(상하: 0, 좌우: 1)
while (queue.length) {
const [x, y, cost, dir] = queue.shift();
for (let i=0; i<4; i++) {
const nx = x + dx[i];
const ny = y + dy[i];
if (nx < 0 || ny < 0 || nx >= n || ny >= n || board[nx][ny] === 1) continue;
const direction = i < 2 ? 0 : 1;
const costByDirection = dir === direction || (x === 0 && y === 0) ? 100 : 600;
if (visit[nx][ny] === 0 || visit[nx][ny] >= cost + costByDirection) {
visit[nx][ny] = cost + costByDirection;
queue.push([nx, ny, cost + costByDirection, direction]);
}
}
}
return visit[n-1][n-1];
};
function solution(board) {
return bfs(board);
}
풀이
흔한 BFS 문제와 약간 차이가 존재한다.
- 상-하 방향으로 이동하고 있었는지, 좌-우 방향으로 이동하고 있었는지를 구분해 비용을 다르게 계산해야 한다.
- visit 배열을 검사할 때, 단순히 방문한 노드는 건너뛰는 것이 아니라 이전에 계산했던 비용이 현재 계산된 비용보다 크다면 다시 queue에 집어넣는다.
Author And Source
이 문제에 관하여([JavaScript] 프로그래머스 경주로 건설 LEVEL3), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@johnyejin/JavaScript-프로그래머스-경주로-건설-LEVEL3저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)