본문 바로가기

코테문제

[백준] S1260

#https://www.acmicpc.net/problem/1260

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

 

# 아이디어

막막하다.. 감도 안 잡힘.

 

일단 생각난 큰 틀

1. edge 입력받아서 vertex끼리 연결된 배열?같은거 만들기

2.

- DFS: 연결된 것 중에 가장 작은거 찾기 -> 작은 vertex로 이동 -> 재귀. 종료조건: cnt == vertex 수

- BFS: 연결된 것 중에 가장 작은 vertex 2개 찾아서 left, right 정하기 -> 큐에다가 왼쪽 전부 다, 오른쪽 전부 다 따로 출력???

 

처참한 코드...

package baekjoon;

import java.util.Scanner;

public class S1260 {

	public static void dfs(int start, int cnt) {

	}

	public static void bfs(int start) {

	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int vertex, edge, start;
		vertex = sc.nextInt();
		edge = sc.nextInt();
		start = sc.nextInt();

		int[] left = new int[vertex];
		int[] right = new int[vertex];
		for (int i = 0; i < edge; i++) {
			left[i] = sc.nextInt();
			right[i] = sc.nextInt();
		}
		
		// 간선 연결된 정보를 갖는 무언가 만들자
		

		int cnt = 0;
		dfs(start, cnt);
		System.out.println();
		cnt = 0;
		bfs(start);

	}

}

 

 

# 블로그 참조(ㄹㅈㄷ로 빠른 포기)

인접행렬을 그리자. 노드간에 간선이 연결된 좌표에 1저장.

노드의 번호가 1부터 시작하기 때문에 [N+1][N+1] 크기의 배열을 사용하면, 직관적으로 배열의 인덱스를 편하게 이용할 수 있다.

 

정답 코드

package baekjoon;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class S1260 {

	public static void dfs(int start, int[][] matrix, int[] visited) {
		visited[start] = 1;
		System.out.print(start + " ");

		int vertex = visited.length - 1;
		for (int i = 1; i <= vertex; i++) {
			if (matrix[start][i] == 1 && visited[i] == 0) {
				dfs(i, matrix, visited);
			}
		}

	}

	public static void bfs(int start, int[][] matrix, int[] visited) {		
		Queue<Integer> queue = new LinkedList<Integer>();
        queue.offer(start);
        visited[start] = 1;

        System.out.print(start + " ");

		int vertex = visited.length - 1;
        while(!queue.isEmpty()) {
            int n = queue.poll();

			// 노드 하나로 연결된 노드 먼저 다 체크 
            for(int i = 1; i <= vertex; i++) {
           		 // 연결된 노드인데 방문하지 않은 경우 
                if(matrix[n][i] == 1 && visited[i] == 0) {
                    visited[i] = 1;
                    System.out.print(i + " ");
                    queue.offer(i);
                }
            }
        } 
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int vertex, edge, start;
		vertex = sc.nextInt();
		edge = sc.nextInt();
		start = sc.nextInt();

		int[][] adjacencyMatrix = new int[vertex + 1][vertex + 1];
		int[] visited;

		int left, right;
		for (int i = 0; i < edge; i++) {
			left = sc.nextInt();
			right = sc.nextInt();
			adjacencyMatrix[left][right] = adjacencyMatrix[right][left] = 1;
		}

		visited = new int[vertex + 1];
		dfs(start, adjacencyMatrix, visited);
		System.out.println();

		visited = new int[vertex + 1];
		bfs(start, adjacencyMatrix, visited);

		sc.close();
		
	}

}

 

- DFS: 방문노드 visited 1로 바꿔주고, 노드 수만큼 for문을 반복하며 if 조건문을 통해 방문노드의 인접노드인지 판별 후 재귀.

- BFS: 맨처음 시작노드를 큐에 넣는다. 큐에 들어간 노드를 출력하고 for문으로 반복하며 출력한 노드와 인접한 노드를 방문하고 출력하고 큐에 저장한다. 이를 큐가 빌 때까지 반복함.

 

최종 수정 코드

package baekjoon;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class S1260 {

	public static void dfs(int start, int[][] matrix, int[] visited) {
		visited[start] = 1;
		System.out.print(start + " ");

		int vertex = visited.length - 1;
		for (int i = 1; i <= vertex; i++) {
			if (matrix[start][i] == 1 && visited[i] == 0) {
				dfs(i, matrix, visited);
			}
		}

	}

	public static void bfs(int start, int[][] matrix, int[] visited) {
		Queue<Integer> queue = new LinkedList<Integer>();

		visited[start] = 1;
		queue.offer(start);

		int vertex = visited.length - 1;
		while (!queue.isEmpty()) {
			int n = queue.poll();
			System.out.print(n + " ");

			for (int i = 1; i <= vertex; i++) {
				if (matrix[n][i] == 1 && visited[i] == 0) {
					visited[i] = 1;
					queue.offer(i);
				}
			}
		}
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int vertex, edge, start;
		vertex = sc.nextInt();
		edge = sc.nextInt();
		start = sc.nextInt();

		int[][] adjacencyMatrix = new int[vertex + 1][vertex + 1];
		int[] visited;

		int left, right;
		for (int i = 0; i < edge; i++) {
			left = sc.nextInt();
			right = sc.nextInt();
			adjacencyMatrix[left][right] = adjacencyMatrix[right][left] = 1;
		}

		visited = new int[vertex + 1];
		dfs(start, adjacencyMatrix, visited);
		System.out.println();

		visited = new int[vertex + 1];
		bfs(start, adjacencyMatrix, visited);

		sc.close();

	}

}

 

 

💯💯💯

DFS, BFS 감도 안 잡히네;;;

백준 문제 많이 풀어봐야 할 듯...

'코테문제' 카테고리의 다른 글

[백준] S17086  (0) 2023.11.20
[백준] S2606  (1) 2023.11.12
[백준] S16173  (0) 2023.10.31
[백준] B11170  (0) 2023.10.12
[백준] B2460  (0) 2023.09.29