새소식

⌨️ Algorithms/백준

[Python] 백준 1260번_DFS와 BFS

2023. 1. 18. 22:47

  • -

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

 

1260번: DFS와 BFS

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

www.acmicpc.net

 

  • 그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하기
  • 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문
  • 더 이상 방문할 수 있는 점이 없는 경우 종료
  • 정점 번호는 1번부터 N번까지
  • 입력
    • 첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어짐
    • 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어짐
    • 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있음
    • 입력으로 주어지는 간선은 양방향
  • 출력
    • 첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력
    • V부터 방문된 점을 순서대로 출력
  • 시간 제한: 2초
  • 메모리 제한: 128 MB

 

"""
입출력 예시)

(예제 입력 1) 
4 5 1
1 2
1 3
1 4
2 4
3 4
    -> 1 2 4 3
       1 2 3 4

(예제 입력 2)
5 5 3
5 4
5 2
1 2
3 4
3 1
    -> 3 1 2 5 4
       3 1 4 2 5

(예제 입력 3)
1000 1 1000
999 1000
    -> 1000 999
       1000 999
"""

 

 

## 의사코드 ##

# DFS -> 재귀
#    # 해당 노드 방문 처리
#    visited[node] = True
#    # 탐색 순서 출력
#     print(node, end = ' ')
#     # 탐색
#     for i in graph[node]:
#         if not visited[i]:
#             dfs(graph, i, visited)

# BFS -> deque
#     # 큐에 시작 정점 삽입
#     q = deque[v]
#     # 시작 정점 방문 처리
#     visited[v] = True
#     # 탐색 순서 출력
#     print(node, end = ' ')
#     # 탐색
#     while q:
#         node = q.popleft()
#         for i in graph[node]:
#             if not visited[i]:
#                 visited[i] = True
#                 q.append(i)

 

 

 

첫 번째 시도

 

import sys
input = sys.stdin.readline
from collections import deque

# 정점의 개수(n), 간선의 개수(m), 시작 정점(v)
n, m, v = map(int, input().split())

# 그래프에 값 입력
graph = [[] for _ in range(n+1)]
for _ in range(1, m+1):
    a, b = map(int, input().split())
    graph[a].append(b)
    graph[b].append(a) # 주어진 간선은 양방향

# 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하기 위해 오름차순 정렬
graph.sort() 

# DFS 함수
def dfs(graph, node, visited):
    print(node, end=' ')
    visited[node] = True 
    for i in graph[node]:
        if not visited[i]:
            dfs(graph, i, visited)

# BFS 함수
def bfs(graph, start, visited):
    q = deque([start])
    visited[start] = True
    while q:
        node = q.popleft()
        for i in graph[node]:
            if not visited[i]:
                visited[i] = True
                print(i, end=' ')
                q.append(i)

# visited 초기화
visited = [False] * (n+1)
# DFS 수행
dfs(graph, v, visited) # v = 시작 정점

print()

# visited 초기화
visited = [False] * (n+1)
# BFS 수행
bfs(graph, v, visited) # v = 시작 정점

-> 틀림

 

 

  • 출력 확인
n = 4
m = 5
v = 1
graph = [[], [2, 3, 4], [1, 4], [1, 4], [1, 2, 3], []]

"""
1 
"""

-> dfs(), bfs() 둘 다 출력값 틀림

 

 

 

두 번째 시도

 

import sys
input = sys.stdin.readline
from collections import deque

# 정점의 개수(n), 간선의 개수(m), 시작 정점(v)
n, m, v = map(int, input().split())

# 그래프에 값 입력
graph = [[] for _ in range(n+1)]
for _ in range(m):
    a, b = map(int, input().split())
    graph[a].append(b)
    graph[b].append(a) # 주어진 간선은 양방향

# 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하기 위해 오름차순 정렬
for adj in graph:
    adj.sort()

# DFS 함수
def dfs(node):
    print(node, end=' ')
    visited[node] = True 
    for i in graph[node]:
        if not visited[i]:
            dfs(i)

# BFS 함수
def bfs(start):
    q = deque([start])
    visited[start] = True
    while q:
        node = q.popleft()
        for i in graph[node]:
            if not visited[i]:
                visited[i] = True
                print(i, end=' ')
                q.append(i)

# visited 초기화
visited = [False] * (n+1)
# DFS 수행
dfs(v) # v = 시작 정점

print()

# visited 초기화
visited = [False] * (n+1)
# BFS 수행
bfs(v) # v = 시작 정점

-> 그래프를 정렬할 때 그래프의 각 원소들을 정렬하는 것으로 변경

-> 틀림

 

  • 출력 확인
n = 4
m = 5
v = 1
graph = [[], [2, 3, 4], [1, 4], [1, 4], [1, 2, 3], []]

"""
1 2 4 3 
2 3 4 
"""

-> bfs()에서 시작 정점이 출력되지 않아서 틀림

 

 

 

통과한 코드

 

import sys
input = sys.stdin.readline
from collections import deque

# 정점의 개수(n), 간선의 개수(m), 시작 정점(v)
n, m, v = map(int, input().split())

# 그래프에 값 입력
graph = [[] for _ in range(n+1)]
for _ in range(m):
    a, b = map(int, input().split())
    graph[a].append(b)
    graph[b].append(a) # 주어진 간선은 양방향

# 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하기 위해 오름차순 정렬
for adj in graph:
    adj.sort()

# DFS 함수
def dfs(node):
    print(node, end=' ')
    visited[node] = True 
    for i in graph[node]:
        if not visited[i]:
            dfs(i)

# BFS 함수
def bfs(start):
    q = deque([start])
    while q:
        node = q.popleft()
        # 시작 정점부터 출력하기 위해 시작 정점의 방문처리를 여기서 진행
        if not visited[node]:
            visited[node] = True 
            print(node, end=' ') 
            for i in graph[node]:
                if not visited[i]:
                    q.append(i)

# visited 초기화
visited = [False] * (n+1)
# DFS 수행
dfs(v) # v = 시작 정점

print()

# visited 초기화
visited = [False] * (n+1)
# BFS 수행
bfs(v) # v = 시작 정점

-> bfs() 함수에서 visited[start] = True를 삭제

 

 

  • 출력 확인
n = 4
m = 5
v = 1
graph = [[], [2, 3, 4], [1, 4], [1, 4], [1, 2, 3], []]

"""
1 2 4 3 
1 2 3 4 
"""
n = 5
m = 5
v = 3
graph = [[], [2, 3], [5, 1], [4, 1], [5, 3], [4, 2], []]

"""
3 1 2 5 4 
3 1 4 2 5 
"""

 

 

 

 

 

참고)

 

https://heytech.tistory.com/55

 

[알고리즘] 깊이 우선 탐색(DFS) 알고리즘에 대해 알아보자!(+Python 구현)

본 포스팅에서는 깊이 우선 탐색 DFS(Depth-First Search) 알고리즘에 대해 알아봅니다. 📚 목차 1. DFS 알고리즘이란? 2. DFS 알고리즘 동작 과정 3. DFS 파이썬 구현 1. DFS 알고리즘이란? DFS(Depth-First Search)

heytech.tistory.com

 

https://heytech.tistory.com/56

 

[Python] BFS 알고리즘 개념 및 실습

본 포스팅에서는 너비 우선 탐색이라고 불리는 BFS(Breadth-First Search)에 대해 알아봅니다. 📚 목차 1. BFS 알고리즘이란? 2. BFS 알고리즘 동작 과정 3. BFS 파이썬 구현 3.1. 소스코드 설명 3.2. 전체 소스

heytech.tistory.com

 

 

'⌨️ Algorithms > 백준' 카테고리의 다른 글

[Python] 백준 9663번_N-Queen  (0) 2023.01.20
[Python] 백준 1697번_숨바꼭질  (0) 2023.01.19
[Python] 백준 1753번_최단경로  (0) 2023.01.17
[Python] 백준 5585번_거스름돈  (0) 2023.01.16
[Python] 백준 11399번_ATM  (0) 2023.01.16
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다!