https://school.programmers.co.kr/learn/courses/30/lessons/12978
DFS(재귀)로 풀었지만, 32번 테스트가 시간 초과 실패.
function solution(N, road, K) {
const graph = road.reduce((obj, [p1, p2, t]) => {
(obj[p1] = obj[p1] || {}), (obj[p2] = obj[p2] || {});
obj[p1][p2] = obj[p2][p1] = Math.min(obj[p1][p2] ? obj[p1][p2] : Infinity, t);
return obj;
}, {});
return (dfs = (dest, distance, result, visited) => {
(visited[dest] = true), result.add(dest);
for (const key in graph[dest]) {
if (visited[key] || distance + graph[dest][key] > K) continue;
dfs(key, distance + graph[dest][key], result, visited);
visited[key] = false;
}
return result;
})("1", 0, new Set(), {}).size;
}
인접 리스트와 DFS(반복문)를 활용하여 다시 풀이.
function solution(N, road, K) {
const graph = road.reduce((obj, [p1, p2, t]) => {
(obj[p1] = obj[p1] || {}), (obj[p2] = obj[p2] || {});
obj[p1][p2] = obj[p2][p1] = Math.min(obj[p1][p2] ? obj[p1][p2] : Infinity, t);
return obj;
}, {}); // 무방향 그래프
const stack = [{ dest: 1, cost: 0 }], // 첫 노드로 가는 정보를 삽입
distance = new Array(N + 1).fill(Infinity); // distance는 각 노드의 최단 경로를 저장
while (stack.length) { // dfs
const { dest: cur, cost: cost } = stack.pop();
if (distance[cur] > cost) distance[cur] = cost; // 최단 경로로 갱신
for (const dest in graph[cur]) {
if (distance[dest] < cost + graph[cur][dest]) continue; // dest 좌표의 경로 값보다, 현재 좌표에서 dest 좌표로 가는 경로가 크면 굳이 방문을 안함.
stack.push({ dest: dest, cost: cost + graph[cur][dest] });
}
}
return distance.filter((e) => e !== Infinity && e <= K).length; // K보다 낮은 최단 경로의 갯수만 추출
}
'Coding Test > Programmers' 카테고리의 다른 글
[Programmers] Lv 2. 가장 큰 정사각형 찾기 (0) | 2023.03.20 |
---|---|
[Programmers] (완전탐색) Lv 2. 전력망을 둘로 나누기 (0) | 2023.03.17 |
[Programmers] (2021 Dev-Matching: 웹 백엔드 개발자(상반기)) Lv 2. 행렬 테두리 회전하기 (0) | 2023.03.15 |
[Programmers] (2020 카카오 인턴십) Lv 2. 수식 최대화 (0) | 2023.03.13 |
[Programmers] Lv 2. 택배상자 (0) | 2023.03.13 |
댓글