[BOJ] 11403 경로찾기.java

전영서·2021년 8월 28일
0

Algorithm

목록 보기
9/89

1. 문제

2. 코드

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

/**
 * Author : YoungSeo Jeon
 * Date : 2021-08-28
 * Description : 백준 11403
 */

public class Main{
	public static void main(String[] args) throws IOException
	{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
   		 //정점의 개수
		int N = Integer.parseInt(br.readLine())+1;
		//입력 행렬, 결과 행렬
		int[][] matrix = new int[N][N];
		int[][] rMatrix = new int[N][N];
    
    		//입력받는다.
		for(int i=1; i<N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			for(int j=1; j<N; j++) {
				matrix[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		//각각의 번호에서 출발해서 갈수있는 곳을 1로 만들어준다.
		for(int i=1; i<N; i++) {
      			//BFS위한 큐와 방문 여부 리스트
			Queue<Integer> queue = new LinkedList<Integer>();
			boolean[] visited = new boolean[N];
			//첫 원소 추가
			queue.add(i);
			//큐가 빌때까지 진행한다.
			while(!queue.isEmpty()) {
				int curr = queue.poll();
			 	 // curr 정점에서 갈수 있는곳을 큐에 넣고 방문 체크한다. 이때 이미 간곳은 가지 않는다.(중복 및 무한루프 가능성)
				for(int j=1; j<N; j++) {
					if(matrix[curr][j] == 1 && !visited[j]) {
						rMatrix[i][j] = 1;
						queue.add(j);
						visited[j] = true;
					}
				}		
				
			}
		}
		//출력한다.
		for(int i=1; i<N; i++) {
			for(int j=1; j<N; j++) {
				bw.write(rMatrix[i][j]+" ");
			}
			bw.newLine();
		}
		
		bw.flush();
		bw.close();
		br.close();
			
	}
}

3.Review

각 출발 원소에서 갈수있는 원소를 모두 1로 만들면 되는 문제이다.

항상 문제를 천천히 꼼꼼히 읽어야 나중에 수정할 고생이 줄어든다.

처음에는 표준 출력을 사용하여 출력을 했다가 시간차이가 얼마나 나는지 궁금해서

버퍼를 사용하여 출력을 해보았다.

시간이 절반으로 줄은 것을 볼수 있다....

빠르긴하네...

profile
꾸준히 성실하게

0개의 댓글