첫번째 풀이 (성공)
문제에 정해진 destination에서 다른 부대로 이동하기까지 최소비용을 구한다 => 몇일 전 공부한 다익스트라가 생각났다.
- 시작노드에서 각 노드까지 최소비용값을 저장할 distance 배열을 만든다
- 이 때 인덱스 = 노드값 동일하게 하기 위해 길이는 n+1이다
- 최소비용을 구하므로 Infinity로 초기화한다.
- roads를 순회하며 각 노드에 연결된 neighbors를 정리하여 양방향 그래프 graph를 만든다. (distance와 같은 길이)
- queue에 방문한 노드를 추가하는데 초기화로 시작노드 destination을 넣는다
- queue.shift하여 시작노드의 값을 구하고, 2번에서 구한 graph에서 시작노드와 연결된 next를 구한다
- 시작노드에서 next 까지 최소비용을 구한다
- 누적비용 = 시작노드의 비용 + 1
- 누적비용 < distance[next] 이면 distance[next] 즉 next노드까지 최소비용을 갱신한다.
- next노드를 queue에 넣는다
- 4번~6번의 과정을 모든 노드를 방문할 때까지, 즉 queue.length === 0 일 때까지 반복한다
- 매 source까지의 최단비용을 distance에서 구하는데 Infinity이면 즉 비용조차 없다면 -1을 그 외는 distance[source]를 반환한다.
function solution(n, roads, sources, destination) {
// 그래프생성
const graph = {};
roads.forEach(([to, from]) => {
if (!(to in graph)) {
graph[to] = [];
}
if (!(from in graph)) {
graph[from] = [];
}
graph[to].push(from);
graph[from].push(to);
})
// weightArr, queue 초기화
const weightArr = Array.from({length: n+1}, () => Infinity);
weightArr[destination] = 0;
const queue = [];
queue.push(destination);
while(queue.length) {
const curr = queue.shift();
graph[curr].forEach((nextNode) => {
const acc = weightArr[curr] + 1;
if (weightArr[nextNode] > acc) {
weightArr[nextNode] = acc;
queue.push(nextNode);
}
})
}
return sources.map(source => weightArr[source] === Infinity ? -1 : weightArr[source])
}
'알고리즘' 카테고리의 다른 글
[레벨2] n^2 배열 자르기 (0) | 2023.11.03 |
---|---|
[프로그래머스 LV2] 연속 부분 수열 합의 개수 JS (0) | 2023.11.03 |
[레벨3] 기지국 설치 (0) | 2023.11.01 |
[다익스트라] 배달 (0) | 2023.11.01 |
[two pointer] 릿코드 3Sum (medium) (0) | 2023.10.30 |