본문 바로가기

카테고리 없음

백준 온라인 저지 - 11403번: 경로 찾기

🔍 문제


 

 

11403번: 경로 찾기

가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시오.

www.acmicpc.net

 

✏️ 풀이 - Java


 

처음 출발하는 정점을 고정시켜놓고 정점을 탐색할때마다 출발 정점에서 탐색가능한 정점으로 간주하여 입력으로 들어온 배열에 경로로 갈수 있는 값을 1로 바꿔주었다. bfs는 큐, dfs는 스택을 이용해서 풀어보았는데 bfs가 근소한 차이로 조금 더 빨랐다.

boj사이트에서 이 문제를 가장 빨리 푼 사람의 코드는 내 코드와 비교 했을 때 실행시간이 2배정도 빨랐는데, 입력값으로 들어오는 인접행렬을 boolean값으로 바꿔 이 하나의 2차원 배열을 3중 for문을 돌려서 [0, 1] -> [1, 2] 로 갈 수 있다면 [0, 2]로 갈 수 있는 것으로 간주하여 값을 바꿔주는 식으로 푼 것을 보았다. 크으... 👏👏👏 풀고나서 다른 사람 코드보는 것도 하나의 재미인 것 같다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
import java.util.StringTokenizer;

public class PathSearch {

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

        int n = Integer.parseInt(st.nextToken()); //n개의 줄 

        int[][] a = new int[n][n]; //입력값 받기 

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

        bfs(a, n);

        //결과 print
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                System.out.print(a[i][j] + " ");
            }
            System.out.println();
        }

    }

    //bfs로 풀기 - queue
    private static void bfs(int[][] a, int n) {
        for(int i = 0; i < n; i++) {
            Queue<Integer> q = new LinkedList<>();
            boolean[] c = new boolean[n];
            q.add(i);

            while(!q.isEmpty()) {
                int v = q.poll();

                for(int j = 0; j < n; j++) {
                    if(a[v][j] == 1 && !c[j]) {
                        c[j] = true;
                        a[i][j] = 1;
                        q.add(j);
                    }
                }
            }

        }
    }

    //dfs로 풀기 - stack
    private static void dfs(int[][] a, int n) {
        for(int i = 0; i < n; i++) {
            Stack<Integer> stack = new Stack<>();
            boolean[] c = new boolean[n];
            boolean flag = false;

            stack.push(i);

            while(!stack.isEmpty()) {
                int v = stack.peek();

                flag = false;

                for(int j = 0; j < n; j++) {
                    if(a[v][j] == 1 && !c[j]) {
                        stack.push(j);
                        c[j] = true;
                        a[i][j] = 1;
                        flag = true;
                        break;
                    }
                }

                if(!flag) stack.pop();
            }
        }


    }
}