티스토리 뷰
안녕하세요. 오늘은 DFS(깊이우선 탐색)을 이용하여
"출발점에서 "목적지"까지 도달하는 모든 경로를 구하는 법에 대해 알아보겠습니다.
위의 사진처럼 있을때 1 노드에서 4 노드로 가는 모든 경우의 수는 어떻게 구할까요?
일단 깊이우선 탐색(DFS) 을 구현해보겠습니다.
class DFSAlgorithm{ private int maps[][] = new int [6][6]; //DFS 인접행렬 private boolean visit[] = new boolean[6]; //방문했나 안했나 판단할 변수 public DFSAlgorithm(){ //클래스 생성자 //스택을 초기화하고 //table 및 visit 변수를 할당 한다. for(int i=0;i<6;i++){ for(int j=0;j<6;j++){ maps[i][j] = 0; } } for(int i=0;i<6;i++){ visit[i] = false; } } public void inputData(int i,int j){ //데이터를 집어넣는 함수 //i,j를 넣으면 인접행렬에 값을 넣어준다. //무방향 그래프이므로 대칭해서 넣어준다. maps[i][j] = 1; maps[j][i] = 1; } public void DFS(int v){ //DFS 구현 부분 visit[v] = true; System.out.print(v); //방문노드를 보여주기위한 출력 for(int i=0;i<6;i++){ if(maps[v][i]==1 && !visit[i]){ //노드가 이어져있고 방문을 하지 않았으면 DFS(i); } } } }
그리고 위에서 보여준 그림의 데이터를 대입해보고 DFS(1) 의 결과를 보겠습니다.
public class test { public static void main(String[] args) { // TODO Auto-generated method stub DFSAlgorithm d = new DFSAlgorithm(); d.inputData(1, 2); d.inputData(1, 3); d.inputData(2, 3); d.inputData(2, 5); d.inputData(3, 4); d.inputData(3, 5); d.inputData(4, 5); d.DFS(1); } }
네 위와 같이 1 2 3 4 5 순으로 방문하였습니다.
하지만 저희가 구해야 할 것은 1부터 4까지 가는 모든 경로이기 때문에 DFS(int v) 코드를 아래와 같이 수정해야 합니다.
public void DFS(int v, int goal){ //v :출발노드 goal:도착노드
출발노드 v와 도착노드 goal을 인자로 받습니다.
경로를 받기 위해 stack도 추가해야하는데요
클래스 변수에 stack을 추가해줍시다.
Stack<Integer> stack;
그리고 생성자에서도 stack을 초기화 해줍시다!
stack = new Stack();
자 이제 준비는 끝났습니다.
DFS 구현부분을 아래와 같이 바꿔보았습니다.
public void DFS(int v,int goal){ //DFS 구현 부분 visit[v] = true; stack.push(v); //스택에 값을 넣어준다. if(v == goal){ //목표노드에 왔으면 //// 스택값 출력 int count=stack.size(); //스택의 크기를 받을 변수 for(int i=0; i<count;i++){ System.out.print(stack.elementAt(i)+" "); } System.out.println("출력완료"); //// 스택값 출력 stack.pop(); //DFS에서 빠져나올땐 pop을 합니다. return; } for(int i=0;i<6;i++){ if(maps[v][i]==1 && !visit[i]){ //노드가 이어져있고 방문을 하지 않았으면 DFS(i,goal); visit[i]=false; //DFS에서 빠져나오면 해당노드는 방문하지 않은 것으로 한다. } } stack.pop(); //DFS에서 빠져나올땐 pop을 합니다. }
중요한 부분은 아래 부분 입니다.
for(int i=0;i<6;i++){ if(maps[v][i]==1 && !visit[i]){ //노드가 이어져있고 방문을 하지 않았으면 DFS(i,goal); visit[i]=false; //DFS에서 빠져나오면 해당노드는 방문하지 않은 것으로 한다. } }
visit[i] = false; 를 함으로써 DFS의 다른 모든 경로도 구할 수 있게 되었습니다.
위와 같이 했을 경우 실행 결과입니다.
이것으로 DFS알고리즘을 이용하여 모든 경로를 구하는 법에 대해 알아보았습니다^^
감사합니다.
'프로그래밍 > 알고리즘' 카테고리의 다른 글
자바로 만드는 다익스트라 (dijkstra) 알고리즘 (1157) | 2016.12.22 |
---|---|
자바로 만드는 백트래킹 (Backtracking) + n queens 문제 (1173) | 2016.12.15 |
자바로 만드는 조합(Combination) 알고리즘 (1924) | 2016.12.07 |
댓글