전형적인 다익스트라 문제이다. 1번 마을로부터 다른 마을까지 갈 수 있는 최소 거리를 구한 뒤에, k보다 같거나 작은 경우만 카운트 해주면 된다.
<다익스트라 알고리즘 구현>
dist[]
로 선언하여 초기화한다. 가는 길이 존재한다면 해당 weight
를, 경로가 존재하지 않으면 무한대(500001)
값으로 초기화한다.visited[]
를 선언한다.index
를 가져온다. (EXTRACT-MIN)index
를 visited 처리 한 뒤, 그 index의 도시를 거쳐가는 경로가 원래 dist[]에 들어있는 값보다 작으면 값을 변경한다.n-1
번 반복한다.500001
으로 설정한 이유는 최대 노드 개수(=최대 거칠 수 있는 간선의 개수) * 간선의 최대 weight N의 개수 (50) * 간선의 최대 weight (10000) + 1
class Solution {
static final int INF = 500001;
public int solution(int N, int[][] road, int K) {
int answer = 0;
int[][] map = new int[N + 1][N + 1];
// 무한대로 초기화
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if(i==j) continue;
map[i][j] = INF;
}
}
// 간선 정보 저장 (이중 배열)
for (int i = 0; i < road.length; i++) {
int a = road[i][0];
int b = road[i][1];
int w = road[i][2];
if (map[a][b] > w) {
map[a][b] = w;
map[b][a] = w;
}
}
int[] dist = new int[N + 1];
for (int i = 2; i <= N; i++) {
dist[i] = (dist[i]==0) ? INF : map[1][i];
}
boolean[] visited = new boolean[N + 1];
visited[1] = true;
for (int i = 1; i <= N - 1; i++) { // n-1번 반복
// extract-min
// dist 중에 방문하지 않았고 가장 작은 값을 가지는 인덱스를 찾는다.
int min_idx = 1;
int min_value = INF;
for (int j = 2; j <= N; j++) {
if (!visited[j] && dist[j] < min_value) {
min_value = dist[j];
min_idx = j;
}
}
visited[min_idx] = true;
// 거쳐가는게 더 빠른지 확인
for (int j = 2; j <= N; j++) {
if (dist[j] > dist[min_idx] + map[min_idx][j]) {
dist[j] = dist[min_idx] + map[min_idx][j];
}
}
}
// 결과 카운트
for (int i = 1; i <= N; i++) {
System.out.println(dist[i]);
if(dist[i]<=K) answer ++;
}
return answer;
}
}
난이도 : LEVEL 2
딱히 없음