아이디어
- 경로(edge)가 나왔는지 안나왔는지를 INF로 확인 -
int INF = 100_000_001; 최댓값 + 1 → 가독성 좋음
- INF값을 설정할 때는 INF + INF 값이 데이터 타입의 표현값을 넘어가는지 확인이 필요하다. (주의)
- 또는, 그냥 0으로 초기화된 상태에서 최단거리 갱신할 때, 0인지 아닌지 체크하는 코드 추가. 자기자신으로 가는 경로인 경우 skip
어려운점 & 실수
정답
- StringTokenizer, StringBuilder로 최적화
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.util.Arrays;
importjava.util.StringTokenizer;
publicclassN11404 {
publicstaticvoidmain(String[] args) throwsIOException {
BufferedReaderbr = newBufferedReader(newInputStreamReader(System.in));
StringTokenizertoken;
intvertex = Integer.parseInt(br.readLine());
intEdge = Integer.parseInt(br.readLine());
int[][] arr = newint[vertex][vertex];
intINF = 100_000_001; //최댓값 +1// 모든 경우의 수를 INF로 초기화하고 자기자신으로 가는 경로는 0으로 갱신for (inti = 0; i < vertex; i++) {
Arrays.fill(arr[i], INF);
arr[i][i] = 0;
}
// 간선 1개로 건널 수 있는 곳 초기화 "중간에 다른 정점을 거치지 않았을 때 최단 거리"for (inti = 0; i < Edge; i++) {
token = newStringTokenizer(br.readLine());
intfrom = Integer.parseInt(token.nextToken()) - 1;
intto = Integer.parseInt(token.nextToken()) - 1;
intcost = Integer.parseInt(token.nextToken()) - 1;
arr[from][to] = Math.min(arr[from][to], cost);
}
//floyd 알고리즘for (intmid = 0; mid < vertex; mid++) { // (a -> b)경로를 1 ~ V 노드를 거쳐서 갈 때의 최단 거리 갱신for (intstart = 0; start < vertex; start++) { // (start -> mid)for (intend = 0; end < vertex; end++) { // (mid -> end)intnewCost = arr[start][mid] + arr[mid][end];
arr[start][end] = Math.min(arr[start][end], newCost);
}
}
}
StringBuildersb = newStringBuilder();
for (int[] ints : arr) {
Arrays.stream(ints).forEach(n -> {
if (n == INF) n = 0;
sb.append(n).append(" ");
});
sb.append("\n");
}
System.out.println(sb);
}
}
아이디어
int INF = 100_000_001;최댓값 + 1 → 가독성 좋음어려운점 & 실수
정답