반응형
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 |
댓글