티스토리 뷰
Algorithm/[Java+Python+JavaScript]BackJoon
[Java+Python]1260번, DFS와 BFS
Vagabund.Gni 2023. 8. 19. 19:58728x90
반응형
목차
문제
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오.
단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고,
더 이상 방문할 수 있는 점이 없는 경우 종료한다.
정점 번호는 1번부터 N번까지이다.
입력
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다.
다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다.
어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다.
입력으로 주어지는 간선은 양방향이다.
출력
첫째 줄에 DFS를 수행한 결과를, 그다음 줄에는 BFS를 수행한 결과를 출력한다.
V부터 방문된 점을 순서대로 출력하면 된다.
풀이
주어진 그래프를 두 개의 방법으로 각각 순회한 결과를 출력하는 문제이다.
일종의 중간정리 같은 느낌으로 풀었는데, 막연히 DFS가 더 직관적이라 생각했는데
풀다 보니 그렇지도 않다는 것을 슬슬 느끼고 있다.
문제는 별 다를 게 없다. 바로 답으로 가자.
Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;
public class Prob1260 {
static List<Integer>[] graph;
static boolean[] visited;
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());
graph = new ArrayList[n + 1];
for (int i = 1; i <= n; i++) {
graph[i] = new ArrayList<>();
}
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
graph[x].add(y);
graph[y].add(x);
}
for (int i = 1; i <= n; i++) {
Collections.sort(graph[i]);
}
visited = new boolean[n + 1];
dfs(v);
System.out.println();
visited = new boolean[n + 1];
bfs(v);
}
private static void dfs(int node) {
visited[node] = true;
System.out.print(node + " ");
for (int i : graph[node]) {
if (!visited[i]) {
dfs(i);
}
}
}
private static void bfs(int node) {
ArrayDeque<Integer> queue = new ArrayDeque<>();
queue.offer(node);
visited[node] = true;
while (!queue.isEmpty()) {
int v = queue.poll();
System.out.print(v + " ");
for (int i : graph[v]) {
if (!visited[i]) {
queue.offer(i);
visited[i] = true;
}
}
}
}
}
Python
from collections import deque
import sys
sys.setrecursionlimit(10**6)
n, m, v = map(int, sys.stdin.readline().rstrip().split(" "))
graph = [[] for _ in range(n + 1)]
def dfs(node, visited):
visited[node] = True
print(str(node), end=" ")
for i in sorted(graph[node]):
if not visited[i]:
dfs(i, visited)
def bfs(node, visited):
queue = deque()
queue.append(node)
visited[node] = True
while queue:
v = queue.popleft()
print(str(v), end=" ")
for i in sorted(graph[v]):
if not visited[i]:
queue.append(i)
visited[i] = True
for i in range(m):
x, y = map(int, sys.stdin.readline().rstrip().split(" "))
graph[x].append(y)
graph[y].append(x)
dfs_result = []
visited = [False] * (n + 1)
dfs(v, visited)
print(" ".join(dfs_result))
bfs_result = []
visited = [False] * (n + 1)
bfs(v, visited)
print(" ".join(bfs_result))
Performance
반응형
'Algorithm > [Java+Python+JavaScript]BackJoon' 카테고리의 다른 글
[Python]1759번, 암호 만들기, 조합과 집합 다루기 (0) | 2023.09.09 |
---|---|
[Java+Python]1011번, Fly me to the Alpha Centauri (0) | 2023.09.05 |
[Java+Python]2667번, 단지번호 붙이기 (0) | 2023.08.26 |
[Java+Python]2606번, 바이러스 - DFS/BFS (0) | 2023.08.18 |
[Java+Python]24445번, 알고리즘 수업 - 너비 우선 탐색 2 (0) | 2023.08.05 |
[Java+Python]24444번, 알고리즘 수업 - 너비 우선 탐색 1 (0) | 2023.08.03 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 지지
- 알고리즘
- RX100M5
- 동적계획법
- 스트림
- 면접 준비
- 유럽
- 세모
- Algorithm
- 맛집
- spring
- 백준
- 남미
- 세계일주
- 세계여행
- 야경
- 기술면접
- Backjoon
- java
- 중남미
- 여행
- 자바
- 칼이사
- 리스트
- 유럽여행
- 스프링
- BOJ
- 파이썬
- a6000
- Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함