[BOJ] 11403 - 경로 찾기 (Java)

EunBeen Noh·2024년 5월 31일

Algorithm

목록 보기
46/52

알고리즘

  • 그래프 이론
  • 그래프 탐색
  • 최단 경로
  • 플로이드–워셜

1. 문제

2. Idea

  • 플로이드 와셜 알고리즘
  • 정점 i->j로 가는 경로의 존재 여부는 i->k->j로 가는 경로의 존재 여부와 같다.

3. 풀이

3.1. 변수 선언 및 초기화

  • int N: 정점의 개수
  • int[][] arr: 행렬 생성을 위한 이차원 배열
        int N=Integer.parseInt(br.readLine());
        int[][] arr= new int[N][N];
        for(int i=0;i<N;i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                arr[i][j]= Integer.parseInt(st.nextToken());
            }
        }

3.2. 경로 존재 여부 찾기

  • 정점 i에서 j로 갈 때, 경유점 k를 거쳐서 갈 수 있다면, 경로가 존재한다는 것
  • i->k 경로 존재 && k->j 경로 존재 -> i->j 경로 존재
  • 경로 존재 여부 판단 후 배열 값 업데이트
        // i->j = i->k->j
        for (int i = 0; i < N; i++) {
            for (int k = 0; k < N; k++) {
                for (int j = 0; j < N; j++) {
                    // 단순히 갈 수 있는 경로가 있는지만 체크함.
                    if (arr[i][k] == 1 && arr[k][j] == 1) {
                        arr[i][j] = 1;
                    }
                }
            }
        }

3.3. 결과 출력

  • 모든 행렬 결과 출력
        for(int i=0;i<N;i++) {
            String out="";
            for (int j = 0; j < N; j++) {
                out+=(arr[i][j]+" ");
            }
            System.out.println(out);
        }

4. 전체코드

import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int N=Integer.parseInt(br.readLine());
        int[][] arr= new int[N][N];
        for(int i=0;i<N;i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                arr[i][j]= Integer.parseInt(st.nextToken());
            }
        }
        // i->j = i->k->j
        for (int i = 0; i < N; i++) {
            for (int k = 0; k < N; k++) {
                for (int j = 0; j < N; j++) {
                    // 단순히 갈 수 있는 경로가 있는지만 체크함.
                    if (arr[i][k] == 1 && arr[k][j] == 1) {
                        arr[i][j] = 1;
                    }
                }
            }
        }

        for(int i=0;i<N;i++) {
            String out="";
            for (int j = 0; j < N; j++) {
                out+=(arr[i][j]+" ");
            }
            System.out.println(out);
        }
    }
}

0개의 댓글