프로그래머스 Lv.2: 배달
https://programmers.co.kr/learn/courses/30/lessons/12978
다익스트라를 사용하지 않는다면 모든 테스트케이스가 풀리지 않는 문제이다.
나는 DFS 를 이용하여 짧은 경로를 찾는 식으로 풀었는데 모든 테스트케이스를 통과하려면 다익스트라를 사용해야 해서 직접 공부해서 풀었다.
다익스트라를 애니메이션으로 정말 쉽게 설명한 영상:
https://www.youtube.com/watch?v=EFg3u_E6eHU&t=221s
function solution(N, road, K) {
var answer = 0;
// 1. 인접행렬을 만든다.
// N의 범위는 50이므로 50*50 은 충분히 만들만 하다.
let graph = Array(N+1).fill(0).map(e=>Array(N+1).fill(Infinity))
for (let [a,b,c] of road) {
if (c >= graph[a][b]) continue;
graph[a][b] = c;
graph[b][a] = c;
}
// 2. 자기 자신은 0 으로 만들어준다.
for (let i = 1; i <= N; i++){
graph[i][i] = 0;
}
let check = Array(N+1).fill(0); // 방문 체크용 배열
let dist = Array(N+1).fill(Infinity); // 최단 거리 배열
// 3. 다익스트라 알고리즘으로 1번 마을에서 다른 마을까지의 최단경로를 찾는다.
// 방문하지 않은 노드 중에서 현재 위치에서 가장 가까운 노드의
// 인덱스를 반환하는 함수이다.
function nearestNodeIdx(){
let min = Infinity;
let idx = 0;
for (let i = 1; i <= N; i++){
if (!check[i] && dist[i] < min){
min = dist[i];
idx = i;
}
}
return idx;
}
let start = 1; // 시작 위치
// 1번 노드와 연결되어 있는 노드와의 거리를 넣는다.
for (let i = 1; i <= N; i++){
dist[i] = graph[start][i]
}
check[start] = 1;
for (let i = 1; i <= N; i++){
let current = nearestNodeIdx();
check[current] = 1;
for (let j = 1; j <= N; j++){
if (!check[j]) {
// 새로운 거리가 기존의 거리보다 짧으면 교체
let oldd = dist[j];
let newd = dist[current] + graph[current][j]
if (newd < oldd) {
dist[j] = newd;
}
}
}
}
answer = dist.filter(e => e <= K).length;
return answer;
}
Author And Source
이 문제에 관하여(프로그래머스 Lv.2: 배달), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jhoryong/프로그래머스-Lv.2-배달저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)