목차
- 문제
- 내가 푼 방법
- 자바 코드
- 결과 및 회고
1. 문제
https://www.acmicpc.net/problem/11404
2. 내가 푼 방법
플루이드 와샬 알고리즘을 사용해 문제를 풀었다.
주의해야 할 두 가지만 설명하자면, 첫 번째로 입력 값으로 동일한 경로(출발지, 도착지)에 다른 비용을 가지는 값이 있을 수도 있다는 점과 두 번째로 단방향 연결이므로 플루이드 와샬 알고리즘을 작성할 때 0 값을 처리해주어야 한다는 점을 조심해야한다.
if 문을 통해 더 작은 비용을 가지는 값을 저장하도록 해주었다.
int N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
arr = new int[N+1][N+1];
for (int m = 0; m < M; m++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
if (arr[a][b] == 0) arr[a][b] = w;
else if (arr[a][b] > w) arr[a][b] = w;
}
또한 플루이드 와샬 알고리즘에서 arr[i][k] == 0 혹은 arr[k][j] == 0 일 경우에는 continue문으로 건너뛰어주었다.
for (int k = 1; k <= N; k++) {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (i == j) continue;
if (arr[i][k] == 0 || arr[k][j] == 0) continue;
if (arr[i][j] == 0 || arr[i][j] > arr[i][k] + arr[k][j]) {
arr[i][j] = arr[i][k] + arr[k][j];
}
}
}
}
3. 자바 코드
깃허브 풀이 주소
https://github.com/geujeog/BOJ/blob/main/B11404.java
import java.util.*;
import java.io.*;
class Main {
static int N;
static int[][] arr;
public static void main (String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
arr = new int[N+1][N+1];
for (int m = 0; m < M; m++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
if (arr[a][b] == 0) arr[a][b] = w;
else if (arr[a][b] > w) arr[a][b] = w;
}
minCost();
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
bw.write(arr[i][j]+" ");
}
bw.write("\n");
}
br.close();
bw.flush();
bw.close();
}
public static void minCost () {
for (int k = 1; k <= N; k++) {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (i == j) continue;
if (arr[i][k] == 0 || arr[k][j] == 0) continue;
if (arr[i][j] == 0 || arr[i][j] > arr[i][k] + arr[k][j]) {
arr[i][j] = arr[i][k] + arr[k][j];
}
}
}
}
}
}
4. 결과 및 회고
플로이드 와샬 알고리즘 코드를 짤 때 단방향 연결 처리를 해줘야 한다는 것을 뒤늦게 깨달았다.
그래도 삽질한 만큼 기억에 잊혀지지 않을 것 같다. ㅎㅎ
'문제풀이 > 백준' 카테고리의 다른 글
[JAVA] BOJ 백준 12851번 - 숨바꼭질2 (0) | 2023.09.27 |
---|---|
[JAVA] BOJ 백준 1109번 - 섬 (2) | 2023.07.28 |
[JAVA] BOJ 백준 9019번 - DSLR (0) | 2023.06.07 |
[JAVA] BOJ 백준 16234번 - 인구 이동 (1) | 2023.06.06 |
[JAVA] BOJ 백준 13460번 - 구슬 탈출 2 (0) | 2023.06.05 |
댓글