본문 바로가기
My Image
Algorithm/BackJoon

[DFS] 경로찾기(Find Directions)

by Lim-Ky 2017. 11. 22.
반응형

BackJoon 

#11403 - 경로찾기(Find Directions)


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



위 문제는 DFS 탐색 예제입니다...

DFS는 보통 재귀함수 (Recursion)을 사용하는데, 재귀함수에 대한 연습도 할 겸 풀어보시면 좋습니다.


우선 기본적으로 DFS 재귀함수를 통해 i에서 j로가는 경로가 있는지 c 1차원 배열에 경로 여부를 체크합니다. 또한, 다음 경로탐색을 위해 Arrays.fill 메서드를 이용 0으로 초기화 해줍니다.


n+1로 n값에 +1을 한 이유는 편의상 배열의 첨자와 정점의 싱크를 맞추기 위해서 입니다. 0번 인덱스는 신경쓰지 않으셔도 됩니다. 즉 정점은 1부터 시작하니 그냥 2차원배열이든 1차원배열이든 1첨자로 부터 시작하기 위해 n+1크기로 할당한 것입니다.


보통 재귀함수를 하면 무한 루프에 빠지지 않기 위해 초기 분기처리를 하지만, dfs 재귀는 다음 갈 정점을 방문했는지 여부를 따지기 때문에 따로 처리할 필요가 없습니다...


흠...생각보다 별 게 없네요... 아 그리고 해당 문제는 무 방향 그래프가 아닌 방향 그래프란 점은 문제를 파악하시면, 자연스럽게 알 수 있습니다. 아래는 해당 코드입니다.



package BackJoon.Graph.DFS;

import java.util.Arrays;
import java.util.Scanner;

public class FindDirections {

	static int[][] a; // 인접행렬로 이루어진 방향그래프
	static int[] c; //check 방문 여부 저장하는 1차원 배열
	static int[][] path; //i,j로 가는길 여부를 저장하는 2차원 배열
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int n = sc.nextInt();
		a = new int[n+1][n+1];
		c = new int[n+1];
		path = new int[n+1][n+1];
		for(int i=1; i<=n; i++){
			for(int j=1; j<=n; j++){
				a[i][j] = sc.nextInt();
			}
		}
		
		
		for(int i=1; i<=n; i++){
			dfs(i);
			
			for(int j=1; j<=n; j++){
				path[i][j] = c[j];
			}
			//다음 탐색을 위해 리셋
			Arrays.fill(c, 0);
		}
		
		
		for(int i=1; i<=n; i++){
			for(int j=1; j<=n; j++){
				System.out.print(path[i][j]+" ");
			}
			System.out.println();
		}


	}
	private static void dfs(int v) {
		int n = a.length-1;
		
		for(int i=1; i<=n; i++){
			
			//v->i갈 수있는 길이 있고, 방문하지 않은 경우
			if(a[v][i]==1 && c[i]==0){
				c[i] = 1; // 방문체크
				dfs(i);
			}
		}
		
		
	}

}




반응형

'Algorithm > BackJoon' 카테고리의 다른 글

[BFS] 토마토(Tomato)  (0) 2018.04.15
[Recursion] 하노이(Hanoi)  (2) 2018.01.21
[삼성SDS] 백준 - 경사로(Runway)  (0) 2017.11.08
[삼성전자] 백준 - 톱니바퀴(Gear)  (0) 2017.11.07
[TREE] 백준 1991 트리 순회(Tree Order)  (1) 2017.10.30

댓글