알고리즘 문제풀이/백준

#1260 : DFS와 BFS

모항 2022. 6. 1. 17:37

풀이방법

사용된 것:

깊이우선탐색(DFS)

너비우선탐색(BFS)

스택(Stack)

큐(Queue)

 

2022.06.01

기본적인 DFS와 BFS를 둘 다 사용해보는 스탠다드 문제이다.

스택을 이용해 DFS를 해주고, 큐를 이용해 BFS를 해주었다.

단, 방문할 수 있는 노드가 여러 개 있을 때엔 노드의 번호의 크기가 작은 것부터 방문한다는 점에 주의해야 한다. 이 때문에 스택에는 자식노드들을 내림차순으로 넣어주고, 큐에는 오름차순으로 넣어주었다. 인접 리스트의 내용물의 정렬은 TreeSet의 자동 오름차순 정렬과 desceningSet 기능을 이용하여 해결했다.

 

코드

Java(2022.06.01)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.NavigableSet;
import java.util.Queue;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.TreeSet;

public class Main {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());
		int v = Integer.parseInt(st.nextToken());
		//간선정보 읽어와 저장하기
		//인접노드 리스트가 오름차순 정렬된 간선정보 배열
		TreeSet<Integer>[] ascending = new TreeSet[n+1];
		for(int i=1; i<n+1; i++) ascending[i] = new TreeSet<Integer>();
		for(int i=0; i<m; i++) {
			st = new StringTokenizer(br.readLine());
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			ascending[a].add(b);
			ascending[b].add(a);
		}
		//인접노드 리스트가 내림차순 정렬된 간선정보 배열
		NavigableSet<Integer>[] descending = new NavigableSet[n+1];
		for(int i=1; i<n+1; i++) descending[i] = ascending[i].descendingSet();
		
		//DFS 수행
		boolean[] visited = new boolean[n+1];
		ArrayList<Integer> dfs = new ArrayList<Integer>();
		Stack<Integer> stack = new Stack<Integer>();
		stack.add(v);
		while(!stack.isEmpty()) {
			//top의 정점이 이미 방문한 놈이라면 그냥 갖다버리고 continue
			if(visited[stack.peek()]) {stack.pop(); continue;}
			//top의 정점이 아직 방문하지 않은 놈이라면 아래를 수행
			int cur = stack.pop();	//스택에서 꺼내기
			dfs.add(cur);	//출력할 정답에 추가
			visited[cur] = true;	//방문했다고 표시
			for(int i: descending[cur]) {	//모든 자식을 스택에 넣기(내림차순으로)
				stack.add(i);
			}
		}
		//DFS 결과값 출력
		for(int i:dfs) System.out.print(i+" ");
		System.out.println();
		
		
		//BFS 수행
		Arrays.fill(visited, false);
		ArrayList<Integer> bfs = new ArrayList<Integer>();
		Queue<Integer> queue = new LinkedList<Integer>();
		queue.add(v);
		while(!queue.isEmpty()) {
			//가장 앞의 정점이 이미 방문한 놈이라면 갖다버리고 continue
			if(visited[queue.peek()]) {queue.poll(); continue;}
			//가장 앞의 정점이 아직 방문하지 않은 놈이라면 아래를 수행
			int cur = queue.poll();	//큐에서 꺼내기
			bfs.add(cur);	//출력할 정답에 추가
			visited[cur] = true;	//방문했다고 표시
			for(int i: ascending[cur]) {	//모든 자식을 스택에 넣기(오름차순으로)
				queue.add(i);
			}
		}
		
		//BFS 결과값 출력
		for(int i:bfs) System.out.print(i+" ");

	}

}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

#17829 : 222-풀링  (0) 2022.06.04
#14626 : ISBN  (0) 2022.06.01
#1303 : 전쟁 - 전투  (0) 2022.05.30
#2667 : 단지번호붙이기  (0) 2022.05.29
#11659 : 구간 합 구하기 4  (0) 2022.05.29