일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- php 프로그래밍 입문 3판
- php 프로그래밍
- 페이코 친구코드
- php 프로그래밍 입문 예제
- 파이썬
- 페이코 추천인코드
- 백준
- 최단 경로
- Flutter
- Java
- spring
- php 프로그래밍 입문
- 배열
- C언어
- programmers
- php
- 플러터 개발환경 설정
- JAVA SPRING
- 페이코 초대코드
- 스프링
- 페이코 추천인
- 자바
- php 프로그래밍 입문 문제풀이
- SWEA
- 자바 스프링
- C
- 플러터
- php 프로그래밍 입문 솔루션
- php 프로그래밍 입문 연습문제
- 한정 분기
Archives
- Today
- Total
11-07 11:40
ImJay
[BOJ/Java] 11403. 경로 찾기 본문
반응형
[BOJ/Java] 11403. 경로 찾기
문제 해석
이 문제는 주어진 방향 그래프에서 각 정점 𝑖에서 𝑗로 가는 경로가 존재하는지를 파악하는 문제다. 입력으로 주어지는 𝑁×𝑁 행렬에서, 행렬의 각 요소가 1인 경우 해당 정점 간에 직접적인 연결이 있음을 나타내며, 0은 연결이 없음을 나타낸다.
풀이 과정
플로이드-와샬 알고리즘을 사용하여 모든 정점 쌍 간의 가능한 경로를 찾는다. 이 알고리즘은 각 정점을 중간 정점으로 고려하며, 간접적인 경로도 고려하여 연결성을 파악한다.
코드
package edu.ssafy.im.BOJ.Silver.S1.No11403;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
new Main().sol();
}
private int N;
private int[][] graph;
private void sol() throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
N = Integer.parseInt(br.readLine());
graph = new int[N][N];
StringTokenizer st;
// 그래프 초기화
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
graph[i][j] = Integer.parseInt(st.nextToken());
}
}
// 플로이드-와샬 알고리즘 실행
for (int k = 0; k < N; k++) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (graph[i][k] == 1 && graph[k][j] == 1) {
graph[i][j] = 1;
}
}
}
}
// 결과 출력
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
sb.append(graph[i][j]).append(' ');
}
sb.append('\n');
}
bw.write(sb.toString());
bw.flush();
bw.close();
}
}
시간 복잡도 분석
플로이드-와샬 알고리즘의 시간 복잡도는 𝑂(𝑁^3)이다. 이는 각 정점을 한 번씩 중간 정점으로 고려하면서 나머지 정점들 사이의 가능한 경로를 업데이트하기 때문이다.
느낀점
플로이드-와샬 알고리즘을 활용해 모든 정점 쌍의 연결성을 파악하는 방법은 그래프 이론을 이해하고 적용하는 데 매우 유용하다. 이 알고리즘은 간단한 코드로 복잡한 문제를 해결할 수 있으며, 다양한 문제에 적용 가능하다는 점에서 매우 효율적이다.
반응형
'알고리즘 > BOJ - Java' 카테고리의 다른 글
[BOJ/Java] 3055. 탈출 (0) | 2024.04.22 |
---|---|
[BOJ/Java] 2174. 로봇 시뮬레이션 (1) | 2024.04.22 |
[BOJ/Java] 15652. N과 M (4) (1) | 2024.04.21 |
[BOJ/Java] 1463. 1로 만들기 (0) | 2024.04.21 |
[BOJ/Java] 1753. 최단경로 (0) | 2024.04.21 |
Comments