백준 1260번. DFS와 BFS

하우르·2021년 3월 22일
0
post-custom-banner

문제링크: https://www.acmicpc.net/problem/1260

문제

그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.

입력

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.

public class Main {
	public static int[][] createGraph(int N, int M) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int[][] graph = new int[N][N];
		int vertex1;
		int vertex2;
		for (int i = 0; i < M; ++i) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			vertex1 =  Integer.parseInt(st.nextToken());
			vertex2 =  Integer.parseInt(st.nextToken());
			graph[vertex1-1][vertex2-1]=1;
			graph[vertex2-1][vertex1-1]=1;
		}
		return graph;
	}

	public static void DFS(int[][] graph, int start_vertex) {
		HashSet<Integer> visited = new HashSet<>();
		Stack<Integer> will_visit = new Stack<>();
		visited.add(start_vertex);
		will_visit.push(start_vertex);
		while (will_visit.isEmpty() == false) {
			Integer current_vertex = will_visit.pop();
			System.out.print(current_vertex+" ");
			for(int i=0; i<graph.length;i++)
			{
				if(graph[current_vertex-1][i]==1&&!visited.contains(i+1))
				{
					visited.add(i+1);
					will_visit.add(i+1);
					break;
				}
			}
		}
	}
	public static void BFS(int[][] graph, int start_vertex) {
		HashSet<Integer> visited = new HashSet<>();
		Queue<Integer> will_visit = new LinkedList<>();
		visited.add(start_vertex);
		will_visit.add(start_vertex);
		while (will_visit.isEmpty() == false) {
			Integer current_vertex = will_visit.remove();
			System.out.print(current_vertex+" ");
			for(int i=0; i<graph.length;i++)
			{
				if(graph[current_vertex-1][i]==1&&!visited.contains(i+1))
				{
					visited.add(i+1);
					will_visit.add(i+1);
				}
			}
		}
	}
	public static void main(String[] args) throws IOException {
		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[][] graph = createGraph(N, M);
		DFS(graph, V);
		System.out.println();
		BFS(graph, V);

	}
}

런타임 에러가 난다 이유가 뭘까....??

----수정-----

import java.io.IOException;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
	// 함수에서 사용할 변수들
	static int[][] graph; // 간선 연결상태
	static int N; // 정점개수
	static int M; // 간선개수
	static int start; // 시작정점

	public static void DFS(HashSet<Integer> visited, int current_vertex) {
		visited.add(current_vertex);
		System.out.print(current_vertex + " ");
		for (int i = 0; i < graph.length; i++) {
			if (graph[current_vertex - 1][i] == 1 && !visited.contains(i + 1)) {
				visited.add(i + 1);
				DFS(visited,i+1);
			}

		}
	}

	public static void BFS() {
		HashSet<Integer> visited = new HashSet<>();
		Queue<Integer> will_visit = new LinkedList<>();
		visited.add(start);
		will_visit.add(start);
		while (will_visit.isEmpty() == false) {
			Integer current_vertex = will_visit.remove();
			System.out.print(current_vertex + " ");
			for (int i = 0; i < graph.length; i++) {
				if (graph[current_vertex - 1][i] == 1 && !visited.contains(i + 1)) {
					will_visit.add(i + 1);
					visited.add(i + 1);

				}
			}
		}
	}

	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		N = sc.nextInt();
		M = sc.nextInt();
		start = sc.nextInt();

		graph = new int[1001][1001];
		int vertex1, vertex2;

		for (int i = 0; i < M; ++i) {
			vertex1 = sc.nextInt();
			vertex2 = sc.nextInt();
			graph[vertex1 - 1][vertex2 - 1] = graph[vertex2 - 1][vertex1 - 1] = 1;
		}

		DFS(new HashSet(), start);
		System.out.println();
		BFS();

	}
}

런타임에러 고칠려다가
10 10 4
5 4
6 4
6 8
8 9
1 10
2 10
10 3
8 2
1 7
4 10

이 반례를 찾았다.
DFS 부분에서 인접행렬로 그래프를 만드니까 재귀로해야 DFS가 작동을 했다.
그래도 런타인 에러가 났다.

찾아보니 Scanner를 두번 사용해서 문제 였다.
Scanner는 close() 하지 않아도, 프로그램 종료시 자동으로 close()를 하긴하지만 close()를 명시해주는 것이 좋다.

profile
주니어 개발자
post-custom-banner

0개의 댓글