DFS: ๋ค์ฐจ์ ๋ฐฐ์ด์์ ๊ฐ ์นธ์ ๋ฐฉ๋ฌธํ ๋ ๊น์ด๋ฅผ ์ฐ์ ์ผ๋ก ๋ฐฉ๋ฌธ, ํ์ฌ ์ ์ ์์ ๊ฐ ์ ์๋ ๊ณณ๊น์ง ๊ฐ๋ณด๋ฉฐ ํ์.
BFS: ๋ค์ฐจ์ ๋ฐฐ์ด์์ ๊ฐ ์นธ์ ๋ฐฉ๋ฌธํ ๋ ๋๋น๋ฅผ ์ฐ์ ์ผ๋ก ๋ฐฉ๋ฌธ, ํ์ฌ ์ ์ ์์ ์ฐ๊ฒฐ๋ ์ฃผ๋ณ์ ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์.
์ถ์ฒ: https://namu.wiki/w/BFS
๊ธฐ๋ณธ์ ์ธ ํ์์ ๋ค์๊ณผ ๊ฐ๋ค. visited array๋ฅผ ์ฌ์ฉํด ๋ฐฉ๋ฌธํ ๊ณณ์ ๋ค์ ๋ฐฉ๋ฌธํ์ง ์๋๋ก ํด์ผํ๋ค.
#R = number of row #C = number of column # ์ฃผ์ด์ง array A=[[0 for _ in range(C)] for _ in range(R)] # ๋ฐฉ๋ฌธํ ๊ณณ์ ํ๊ธฐํ๊ธฐ ์ํ array vis=[[0 for _ in range(C)] for _ in range(R)] # ํ์ ์ปค์ (์ํ์ข์ฐ) dr = [1,0,-1,0] dc = [0,-1,0,1]
DFS: ์คํ, ์ฌ๊ท๋ก ๊ตฌํ
# ์คํ while(stack): cur = stack.pop() for j in range(4) c = cur + j if vis[c] == 1: continue if ๋ฒ์ ๋ฐ or ๊ฐ ์ ์๋ ๊ณณ : continue stack.append(c) vis[c] = 1 # ์ฌ๊ท def dfs(i): vis[i] = 1; for j in range(4) c = i + j if vis[c] == 1: continue if ๋ฒ์ ๋ฐ or ๊ฐ ์ ์๋ ๊ณณ : continue dfs(c);
BFS: ํ๋ก ๊ตฌํ
# ํ while(queue): cur = queue.popleft() for j in range(4) c = cur + j if vis[c] == 1: continue if ๋ฒ์ ๋ฐ or ๊ฐ ์ ์๋ ๊ณณ : continue queue.append(c) vis[c] = 1
ํ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ์๋ ๋ชจ๋ ๋ ธ๋ ํ์ํ๋ ์ ํ์ด ์ ํ์ ์ด๋ค. ์ด๋๋ DFS, BFS ์๋ฌด๊ฑฐ๋ ์จ๋ ๋์ง๋ง, ํน๋ณํ ์ ํ๋ค๋ ์๋ค.
DFS
๊ฒฝ๋ก ์ฐพ๊ธฐ -> ์ฌ๋ฌ ๊ฒฝ๋ก๋ฅผ ๊ณ ๋ คํด์ผ ํ ๋, ์ฌ๊ท ์ฌ์ฉ
def dfs(i): for j in range(4) c = i + j if vis[c] == 1: continue if ๋ฒ์ ๋ฐ or ๊ฐ ์ ์๋ ๊ณณ : continue vis[c] = 1 dfs(c); vis[c] = 0
์ฌ์ดํด ์ฐพ๊ธฐ -> ์์์ ์ ๋ฐ๋ก ์ ์ฅํด๋๋ค.
def dfs(i): vis[i] = 1; for j in range(4) c = i + j if vis[c] == 1 (์์์ ์ธ์ง ํ์ธ): return "cycle" dfs(c);
์์์ ๋ ฌ -> ์ฐจ์๋ฅผ ์ ์ฅํ๊ณ , ์ง์ ์ฐจ์๊ฐ 0์ธ node ๋ถํฐ ๋ฃ๋๋ค.
for i in range(N): if order[i] == 0: stack.append(i) ans.append(i) while(stack): cur = stack.pop() order[cur] = -1 # ๋ฐฉ๋ฌธํ๋ค๋ ํ์ for i in range(len(A[cur])): order[A[cur][i][0]] -= 1 if order[i] == 0: stack.append(A[cur])
BFS
์ต๋จ๊ฑฐ๋ฆฌ -> BFS๋ฅผ ์ฐ๋ฉด ์ฃผ๋ณ์ ๋จผ์ ํ์ํ๊ธฐ ๋๋ฌธ์, ๋จผ์ ํ์๋๋ ๊ฑฐ๋ฆฌ๊ฐ ์๋์ผ๋ก ์ต๋จ๊ฑฐ๋ฆฌ๋ค.
# ํ while(queue): cur = queue.popleft() ๊ฑฐ๋ฆฌ = cur[1] for j in range(4) c = cur + j if vis[c] == 1: continue if ๋ฒ์ ๋ฐ or ๊ฐ ์ ์๋ ๊ณณ : continue stack.append([c, ๊ฑฐ๋ฆฌ+1]) vis[c] = 1
์ฌ๋ฌ ๊ฐ์ ์ต๋จ๊ฑฐ๋ฆฌ -> while ๋ฌธ์ ์ถ๊ฐํด ํ๊ฐ ๋น ๋๊น์ง ํ์
while(1): cursize = len(queue) while(cursize): cur = queue.popleft() for i in range(len(A)): newcur = cur + A[i] if newcur > K: continue if vis[newcur]==True: continue queue.append(newcur) vis[newcur]=True cursize-=1 cnt += 1
๊น์ด ์ฐ์ ํ์ ๋๋น ์ฐ์ ํ์
https://devuna.tistory.com/32
์ฝ๋ฉ ๋ฌธ์ ์ ํ ์ ๋ฆฌ
https://myeongmy.tistory.com/55
BFS,DFS ๊ตฌํ
https://blog.encrypted.gg/729
์์์ ๋ ฌ
https://m.blog.naver.com/ndb796/221236874984