30 Jan 2023

[Java] 백준 1260번: DFS와 BFS

1260

풀이 방법

오랜만에 올리는 풀이일지다.

입력받은 정점(N)과 간선(M)을 인접행렬로 만든 후, DFS와 BFS의 특성을 이용해 시작지점(V)부터 탐색하면 되는 문제이다.

map[from][to] = map[to][from] = 1 을 쓰면 인접행렬을 더욱 쉽게 만들 수 있다는 꿀팁!

방문배열을 사용하여 한 번 방문한 곳은 다시 방문 못하게 처리를 하면 정답을 도출해낼 수 있을 것이다.

풀이 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class BOJ_1260_DFS와BFS {
	static StringBuilder sb;
	public static void main(String[] args) throws Exception{
		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());
		
		int[][] map = new int[N+1][N+1];
		
		for (int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine());
			int from = Integer.parseInt(st.nextToken());
			int to = Integer.parseInt(st.nextToken());
			
			map[from][to] = map[to][from] = 1;
		}
		
		sb = new StringBuilder();
		
		dfs(map, V, new boolean[N+1]);
		sb.append("\n");
		bfs(map, V);

		System.out.println(sb);
	}

	private static void dfs(int[][] map, int node, boolean[] visit) {
		sb.append(node+" ");
		visit[node] = true;
		
		for (int i = 1; i < map.length; i++) {
			if(map[node][i] == 1 && !visit[i]) {
				dfs(map, i, visit);
			}
		}
		
	}

	private static void bfs(int[][] map, int node) {
		Queue<Integer> q = new LinkedList<Integer>();
		boolean[] visit = new boolean[map.length+1];
		visit[node] = true;
		q.add(node);
		
		while(!q.isEmpty()) {
			int V = q.poll();
			sb.append(V+" ");
			
			for (int i = 1; i < map.length; i++) {
				if(map[V][i] == 1 && !visit[i]) {
					visit[i] = true;
					q.add(i);
				}
			}
		}
		
	}
}
Thank You For Reading
SeungJun Jeon

점점 강해지고 있습니다.

comments powered by Disqus