백준 1260번 풀이
문제풀러가기
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 알아보기
2021.06.11 - [코딩테스트/알고리즘] - (알고리즘)DFS(Depth-First-Search) 깊이 우선 탐색 - 파이썬
(알고리즘)DFS(Depth-First-Search) 깊이 우선 탐색 - 파이썬
DFS 1. DFS동작 예시 DFS(Depth-First-Search)는 말 그대로 깊은 곳에 있는 노드를 탐색하는 방법이다. DFS는 재귀함수를 사용하여 깊이 있는노드를 탐색한다. *재귀함수는 스택과 유사하다. 집어 넣은 순
eunhee-programming.tistory.com
2021.06.10 - [코딩테스트/알고리즘] - (알고리즘)BFS(Breadth-First-Search) 너비 우선 탐색 - 파이썬 + 백준 2178 풀이
(알고리즘)BFS(Breadth-First-Search) 너비 우선 탐색 - 파이썬 + 백준 2178 풀이
BFS 1. BFS동작 예시 - 가까운 노드부터 우선적으로 탐색하는 알고리즘 - BFS는 큐를 사용하여 너비 우선으로 탐색한다. 집어 넣은 순서대로 1 -> 2 -> 3 -> 5 -> 4 -> 8 -> 6 -> 7 2. BFS 코드 예시 from collec..
eunhee-programming.tistory.com
문제

코드
import sys
from collections import deque
N,M,V = map(int, sys.stdin.readline().split())
a_list = [[False]*(N+1)for i in range(N+1)]
visited = [False]*(N+1)
for i in range(M):
a, b = map(int,sys.stdin.readline().split())
a_list[a][b] = a_list[b][a] = True
print(visited)
print(a_list)
def dfs(x):
if visited[x]==False:
visited[x]=True
print(x, end=" ")
for i in range(1,N+1):
if a_list[x][i]==True:
dfs(i)
def bfs(x):
queue = deque([x])
visited[x]=False
while queue:
x=queue.popleft()
print(x, end=" ")
for i in range(1, N+1):
if (visited[i]==True and a_list[x][i]==True):
visited[i]=False
queue.append(i)
dfs(V)
print()
bfs(V)
처음에 input()넣고 하니 계속 출력 초과가 떳습니다 ㅠ_ㅠ
sys.stdin.readline()으로 하니까 되더라구요 ㅎㅎ
코드 풀이

왼쪽 이미지의 예제 입력을 예로 코드를 풀이해보겠습니다.
코드설명 1-1
N=4, M=5, V=1일 경우,
N이 4라는건 1부터 4까지의 정점이 있다는 것입니다.
코드설명 1-2
visited나 a_list를 만들때,False*N 이 아닌 False*(N+1)을 하는 이유는,
곱하기 N을 했을 경우, 만약 1을 방문했을때 표시를 visited[0]=True 로 해야됩니다. (1씩 빼준 인덱스를 넣어야되므로, 헷갈릴 수 있음)
하지만, M+1을 하면, 1을 방문했을때 표시를 visited[1]=True, 제일 큰 정점인 4를 방문했을때,
visited[4]=True를 해도 인덱스 범위에 벗어나지 않으며, 헷갈림을 방지할 수 있습니다.
코드설명1-3
a_list[a][b] = a_list[b][a] =True
=> a_list[a][b] = True & a_list[b][a] = True 둘 다에 표시합니다.
그 이유는, 예제 입력의 N,M,V외의 아래 입력 부분에서, (1,2), (1,3), (1,4)... 등 작은 숫자를 앞에다가 썼지만,
만약 큰 숫자가 앞에 나올 경우 예를 들어 (1,4)가 아닌 (4, 1)을 썼을 경우도 결국 결과는 같기 때문에, 둘 다에 표시해줘야 됩니다.
코드설명1-4
bfs(x)에서는 deque이 아닌 리스트를 써도 되지만, deque이 시간단축이 가능합니다.
* deque을 쓸 때는 꼭 from collections import deque을 써줍니다.
* deque을 썼을때만 popleft()가 사용 가능합니다.
'코딩테스트 > 코딩테스트 문제' 카테고리의 다른 글
코딩테스트 준비 - 프로그래머스: 문자열 압축 풀이+상세 (파이썬) (4) | 2021.06.25 |
---|---|
코딩테스트 준비 - 프로그래머스: 3진법 뒤집기(파이썬)/파이썬 진법 계산 (0) | 2021.06.20 |
코딩테스트 준비 - 백준15649번 N과 M (1)풀이-DFS에 관해서(파이썬) (0) | 2021.06.08 |
코딩테스트 준비 - 백준18870번 좌표압축 풀이:파이썬 딕셔너리 활용 (파이썬) (0) | 2021.06.07 |
코딩테스트 준비 - 백준10814번 나이순 정렬 풀이:파이썬 람다 리스트 정렬 (파이썬) (0) | 2021.06.06 |
댓글