[백준/Java] 11403 - 경로 찾기

2025. 9. 12. 16:28·코딩테스트/백준

https://www.acmicpc.net/problem/11403

문제


풀이

이 문제를 접하면서 플로이드-워셜 알고리즘을 처음 알았다

모든 정점에서 모든 정점으로의 경로를 찾는 문제이므로, 플로이드-워셜 알고리즘을 사용하면 매우 간결하게 해결할 수 있다

플로이드-워셜 알고리즘의 핵심 아이디어는

정점 `i`에서 `j`로 가는 경로가 있을 때, 중간에 정점 `k`를 거쳐가는 경로가 있는가? 이다

코드로 표현하면 아주 간단한 3중 for문으로 완성된다

 

물론 dfs나 bfs로도 해결할 수 있다

모든 정점을 시작점으로 순회하면서 각 정점에서 bfs 탐색을 한다

예를 들어 0번 정점에서 탐색을 시작해서 방문하게 되는 모든 정점들(예: 2, 4, 5)은 0번에서 경로가 존재한다는 의미이다

탐색을 마친 후 결과 행렬의 `[0][2]`, `[0][4]`, `[0][5]` 위치에 1을 표시한다

코드

플로이드-워셜 알고리즘 사용

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

	static int[][] arr;

	static int N;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();

		N = Integer.parseInt(br.readLine());
		arr = new int[N][N];

		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < N; j++) {
				arr[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 (arr[i][k] == 1 && arr[k][j] == 1) {
						arr[i][j] = 1;
					}
				}
			}
		}

		for (int[] ints : arr) {
			for (int num : ints) {
				sb.append(num + " ");
			}
			sb.append('\n');
		}

		System.out.println(sb);
		br.close();
	}
}

 

BFS 사용

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

	static int[][] arr;
	static int[][] result;

	static int N;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();

		N = Integer.parseInt(br.readLine());
		arr = new int[N][N];
		result = new int[N][N];

		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < N; j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}

		for (int i = 0; i < N; i++) {
			bfs(i);
		}

		for (int[] ints : result) {
			for (int num : ints) {
				sb.append(num + " ");
			}
			sb.append('\n');
		}

		System.out.println(sb);
		br.close();
	}

	static void bfs(int node) {
		Queue<Integer> queue = new LinkedList<>();
		boolean[] visited = new boolean[N];
		queue.add(node);

		while (!queue.isEmpty()) {
			int current = queue.poll();

			for (int i = 0; i < N; i++) {
				if (!visited[i] && arr[current][i] == 1) {
					visited[i] = true;
					queue.add(i);
					result[node][i] = 1;
				}
			}
		}
	}
}

결과

제출 번호 98435222 - BFS

제출 번호 98435172 - 플로이드-워셜

'코딩테스트/백준' 카테고리의 다른 글
  • [백준/Java] 1074 - Z
  • [백준/Java] 14940 - 쉬운 최단거리
  • [백준/Java] 11286 - 절댓값 힙
  • [백준/Java] 5525 - IOIOI
KDH.dev
KDH.dev
  • KDH.dev
    CodingHard
    KDH.dev
  • 전체
    오늘
    어제
    • 전체글 (81)
      • 코딩테스트 (74)
        • 프로그래머스 (13)
        • 백준 (61)
      • CS (3)
        • 네트워크 (3)
      • Spring (1)
      • Java (3)
        • 자료구조 (3)
        • 알고리즘 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    [LG유플러스] 유레카 백엔드 개발자
    자바
    18111
    CS
    프로그래머스 Lv.0
    코딩테스트
    백준
    16935
    멀티캠퍼스it부트캠프
    13913
    네트워크
    14940
    30804
    5525
    21736
    11660
    프로그래머스
    부트캠프후기
    17626
    자료구조
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
KDH.dev
[백준/Java] 11403 - 경로 찾기
상단으로

티스토리툴바