๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/1260)
<DFS์ BFS>
๋ฌธ์
๊ทธ๋ํ๋ฅผ DFS๋ก ํ์ํ ๊ฒฐ๊ณผ์ BFS๋ก ํ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋จ, ๋ฐฉ๋ฌธํ ์ ์๋ ์ ์ ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ์๋ ์ ์ ๋ฒํธ๊ฐ ์์ ๊ฒ์ ๋จผ์ ๋ฐฉ๋ฌธํ๊ณ , ๋ ์ด์ ๋ฐฉ๋ฌธํ ์ ์๋ ์ ์ด ์๋ ๊ฒฝ์ฐ ์ข ๋ฃํ๋ค. ์ ์ ๋ฒํธ๋ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ N(1 ≤ N ≤ 1,000), ๊ฐ์ ์ ๊ฐ์ M(1 ≤ M ≤ 10,000), ํ์์ ์์ํ ์ ์ ์ ๋ฒํธ V๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ M๊ฐ์ ์ค์๋ ๊ฐ์ ์ด ์ฐ๊ฒฐํ๋ ๋ ์ ์ ์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ค ๋ ์ ์ ์ฌ์ด์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์ด ์์ ์ ์๋ค. ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ๊ฐ์ ์ ์๋ฐฉํฅ์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ DFS๋ฅผ ์ํํ ๊ฒฐ๊ณผ๋ฅผ, ๊ทธ๋ค์ ์ค์๋ BFS๋ฅผ ์ํํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค. V๋ถํฐ ๋ฐฉ๋ฌธ๋ ์ ์ ์์๋๋ก ์ถ๋ ฅํ๋ฉด ๋๋ค.
๋ฌธ์ ํ์ด
- ์๊ฐ ์ด๊ณผ ์ฝ๋
#์๊ฐ์ด๊ณผ
import sys
if __name__=='__main__':
N,M,V=map(int,sys.stdin.readline().split())
arr={}
check=[False]*N # ๋ค ๋ฐฉ๋ฌธํ๋์ง ํ์ธ
for i in range(M):
a,b=map(int,sys.stdin.readline().split())
if a in arr:
temp=arr.get(a)
temp.append(b)
arr[a]=temp
else:
arr[a]=[b]
if b in arr:
temp = arr.get(b)
temp.append(a)
arr[b]=temp
else:
arr[b]=[a]
for key,value in arr.items():
value=sorted(value)
arr[key]=value
# DFS - ๊น์ด ์ฐ์ ํ์
X=V
result=[X]
check[X-1]=True
while False in check:
for i in arr.get(X):
if check[i-1]==False:
result.append(i)
X=i
check[i-1]=True
break
print(' '.join(map(str,result)))
# BFS - ๋๋น ์ฐ์ ํ์
check=[False]*N
result=[V]
check[V-1] = True
temp=[V]
while False in check:
V=temp.pop(0) # ๋๋น ์ฐ์ ํ์์ด๋ฏ๋ก
for i in arr.get(V):
if check[i-1]==False:
temp.append(i)
result.append(i)
check[i-1]=True
print(' '.join(map(str,result)))
- DFS์ BFS๋ฅผ ๊ตฌํ๋๋ฐ while๋ฌธ for๋ฌธ์ ๋ค ์ฌ์ฉํ Magic
ํ๋ฉด์๋ DFS, BFS ๊ตฌํ๋๋ฐ ์ฝ๋๊ฐ ์ด๋ ๊ฒ ๊ธด๊ฐ ํ๋ฉด์ ๋๋ฌผ ๋ฌ๋ ๋ฌธ์ ์ด๋ค.
๋ด๊ฐ DFS, BFS๋ ๋ชจ๋ฅด๋๊ฐ? ๊ทธ๋ด์ง๋.. ์ด๋ฒ ๊ธฐํ๋ฅผ ํตํด ์ดํดํ ๊ฒ ๊ฐ๋ค!
์ด ๋ฌธ์ ๋ ๊ฐ๋ ๋ฌธ์ ๋ผ DFS, BFS ๊ฐ๋ ๋ถํฐ ์ฐพ์๋ดค๋ค. ์ฌ์ค ๊ฐ๋ ์ฝ๋๋ฅผ ๋ณธ ๊ฒ์ด ์ด ๋ฌธ์ ์ ์ ๋ถ๋ผ๊ณ ์๊ฐํ๋ค..
- ํต๊ณผํ ์ฝ๋
import sys
def dfs(arr, start): # ๊น์ด ์ฐ์ ํ์
visit=[]
temp=[start]
while temp:
x=temp.pop(0)
if x not in visit: # ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด
visit.append(x)
temp=arr.get(x)+temp
return visit
def bfs(arr, start): # ๋๋น ์ฐ์ ํ์
visit=[]
temp=[start]
while temp:
x=temp.pop(0)
if x not in visit: # ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด
visit.append(x)
temp+=arr.get(x)
return visit
if __name__=='__main__':
N,M,V=map(int,sys.stdin.readline().split())
arr={}
for i in range(N): #init
arr[i+1]=[]
for i in range(M): # ์๋ฐฉํฅ ๊ฐ์
a,b=map(int,sys.stdin.readline().split())
arr[a].append(b)
arr[b].append(a)
for key,value in arr.items(): #์์ ๊ฒ ๋จผ์ ๋ฐฉ๋ฌธํ๊ธฐ ์ํด ์ ๋ ฌ
value=sorted(value)
arr[key]=value
print(' '.join(map(str, dfs(arr,V))))
print(' '.join(map(str, bfs(arr, V))))
- dfs
- visit list ์ ์ธ, temp list์ ์์ํ ์ ์ ๋ฒํธ ๋ฃ์ด์ ์ ์ธ
- temp list๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต: temp์์ ๋งจ ์ ๊ฐ์ ๋ฝ์์ ์์ง ๋ฐฉ๋ฌธํ ์ ์ ์ด ์๋๋ผ๋ฉด visit์ ์ถ๊ฐํ๊ณ temp list ์์ ๊ทธ ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ์ ์ ๋ค์ ์ถ๊ฐ - bfs
- visit list ์ ์ธ, temp list์ ์์ํ ์ ์ ๋ฒํธ ๋ฃ์ด์ ์ ์ธ
- temp list๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต: temp์์ ๋งจ ์ ๊ฐ์ ๋ฝ์์ ์์ง ๋ฐฉ๋ฌธํ ์ ์ ์ด ์๋๋ผ๋ฉด visit์ ์ถ๊ฐํ๊ณ temp list์ ๊ทธ ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ์ ์ ๋ค์ ์ถ๊ฐ - main
- ์ ์ ์, ๊ฐ์ ์, ์์ ์ ์ ์ ๋ ฅ
- ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ์ ์ ์ dict๋ก ํํ -> key ๊ฐ๋ค ๋ค ์ ์ธ
- ์๋ฐฉํฅ ๊ฐ์ ์ด๋ฏ๋ก ์์ชฝ key์ value ์ถ๊ฐ
- ์ ์ ๋ฒํธ๊ฐ ์์ ๊ฒ ๋จผ์ ๋ฐฉ๋ฌธํ๊ธฐ ์ํด ์ ๋ ฌ
- dfs, bfs ํธ์ถ
์๊ฐ๐ค
dfs์ bfs๋ฅผ ์ดํดํ๊ณ ๋๋ ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์๋ ๊ฒ ๊ฐ๋ค. ์.. ์๋๊ฐ dfs ์ฝ๋๊ฐ ์๋ชป๋ ๊ฑฐ ๊ฐ๊ธฐ๋ ํ๊ณ ์๋ ๊ฑฐ ๊ฐ๊ธฐ๋ ํ๊ณ ๋ชจ๋ฅด๊ฒ ๋ค ใ _ใ
์ด์ ๊ฒ๋จน์ง ๋ง๊ณ dfs์ bfs ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ๋์ ํด๋ด์ผ๊ฒ ๋ค ๐
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 2667_๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ (0) | 2022.01.07 |
---|---|
[Baekjoon] 2606_๋ฐ์ด๋ฌ์ค (0) | 2022.01.07 |
[Baekjoon] 5397_ํค๋ก๊ฑฐ (0) | 2022.01.05 |
[Baekjoon] 7795_๋จน์ ๊ฒ์ธ๊ฐ ๋จนํ ๊ฒ์ธ๊ฐ (0) | 2022.01.04 |
[Baekjoon] 14426_์ ๋์ฌ ์ฐพ๊ธฐ (0) | 2021.12.27 |