-
03/17(Wed) DFS์ BFS (1)HangHae99/TIL-hanghae99 2021. 3. 18. 00:11
โ๐ผ
DFS ์ BFS ๊ทธ๋ฆฌ๊ณ ์ฌ๊ทํจ์.
๊ฐ๋ ๊ณผ ์ด๋ฅผ ๊ตฌํํ ์ฝ๋๋ฅผ ์ ๋๋ก ์ดํด ํ์ง ์๊ณ ๋์ด ๊ฐ๋๋, ์ฐ์ ๋ง๋ฌ๋ค.
๋์ด๋๊ฐ ์ค์ธ ๋ฌธ์ 3๊ฐ๊ฐ ๋จ์๋๋ฐ, ์ ๋ถ ํ ์ ์์๋ค. DFS, BFS, ์ฌ๊ท๋ฅผ ์ด์ฉํด์ ์ฝ๋๋ฅผ ๋ง๋ค์ด์ผ ํ๋ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํ ์ ์๊ฒ ๋๊ฐ.
์ด์ ์ด์ฉ ์ ์์ผ๋ DFS์ BFS๋ฅผ ์์๋ณด์.
1. DFS (Depth First Search, ๊น์ด ์ฐ์ ํ์)
๊น์ด ์ฐ์ ํ์์ ๋งน๋ชฉ์ ํ์์ ๋ฐฉ๋ฒ์ ํ๋๋ก ํ์ํธ๋ฆฌ์ ์ต๊ทผ์ ์ฒจ๊ฐ๋ ๋ ธํธ๋ฅผ ์ ํํ๊ณ , ์ด ๋ ธ๋์ ์ ์ฉ ๊ฐ๋ฅํ ๋์์ ์ค ํ๋๋ฅผ ์ ์ฉํ์ฌ ํธ๋ฆฌ์ ๋ค์ ์์ค์ ํ ๊ฐ์ ์์๋ ธ๋๋ฅผ ์ฒจ๊ฐํ๋ฉฐ, ์ฒจ๊ฐ๋ ์์ ๋ ธ๋๊ฐ ๋ชฉํ๋ ธ๋์ผ ๋๊น์ง ์์ ์์ ๋ ธ๋์ ์ฒจ๊ฐ ๊ณผ์ ์ ๋ฐ๋ณตํด ๊ฐ๋ ๋ฐฉ์์ด๋ค.
-์ํค๋ฐฑ๊ณผ
์์ง ์ด๋ณด๋ผ ๊ฐ๋ ๋ง ์ฝ์ด์ ๋ฌด์จ ๋ง์ธ์ง ๋ชจ๋ฅด๊ฒ ๊ณ , ์์ ๊ทธ๋ฆผ์ ๋ณด๋ ํธ์ด ๋ ๋ซ๋ค.
1๋ฒ๋ถํฐ 10๋ฒ๊น์ง ์ ๋ฐ ์์๋๋ก ํ์์ ํ๋ค. ๋ ์ด์ ์ฐ๊ฒฐ๋ ๋ฒํธ๊ฐ ์์ ๋๊น์ง ์ญ ํ๊ณ ๋ด๋ ค๊ฐ๋ค.
๊ตฌ๊ธ๋งํ๋ค๊ฐ ์ด๋ค ๋ธ๋ก๊ทธ์์ DFS๋ ์ด์ด๋ฌ๋ฆฌ๊ธฐ ๋ฐํคํฐ์น์ ๋น์ทํ๋ค๋ ๊ธ์ ๋ณด๊ณ ๋ ๋ค๋ก DFS์ ๋ํ ์ดํด๊ฐ ์๋ฒฝํ ๋๋ค.
ํ์ง๋ง ์ด๋ฅผ ๊ตฌํํ ์ฝ๋๋ฅผ ์ง๋ ๊ฒ ์ด๋ ค์์ ๊ฐ๋ ์ดํด๋ง ํ๊ณ ๋์ด๊ฐ์๋๋ฐ, ๋ ์ด์ ํผํ ์ ์์ด์ ์ค๋์ DFS, BFS๋ฅผ ์ฝ๋๋ก ๊ตฌํํด๋ณด๋ ๊ฑธ ๋ชฉํ๋ก ์ผ์๋ค.
๋ฐฑ์ค 1260๋ฒ ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด์ DFS์ ๋ํด ์์๋ณด์.
์์ ์ ๋ ฅ 2๋ฅผ ๋ค๊ณ ์๋ค.
5 5 3
5 4
5 2
1 2
3 4
3 1
์ฒซ์งธ ์ค์ ๋์์๋ 5 5 3์ ์์๋๋ก 'n = ์ ์ ์ ๊ฐ์, m = ๊ฐ์ ์ ๊ฐ์, v = ์ ์ ์ ๋ฒํธ' ๋ผ๊ณ ํ๋ค.
์ด๊ฑด ๋์ค์ ์ฝ๋ ์น ๋ ์๊ฐํด๋ณด๊ธฐ๋ก ํ๊ณ , ๋์งธ ์ค๋ถํฐ ๋ง์ง๋ง ์ค ๊น์ง ๋์์๋ ์ซ์๋ค์ ๊ฐ์ ์ด ์ฐ๊ฒฐํ๋ ๋ ์ ์ ์ ๋ฒํธ๋ผ๋๋ฐ,
์ด๊ฒ ๋ฌด์จ ๋ง์ธ์ง ์ดํด๋ ๋ชปํ์๋ค.
๋ง๋ก ํ์ด์ ์ค๋ช ํ์๋ฉด,
์ซ์ 5๋ 4์ ์ฐ๊ฒฐ๋ผ์๊ณ ,
์ซ์ 5๋ 2์ ์ฐ๊ฒฐ,
์ซ์ 1์ 2์ ์ฐ๊ฒฐ,
์ซ์ 3์ 4์ ์ฐ๊ฒฐ,
์ซ์ 3์ 1๊ณผ ์ฐ๊ฒฐ ๋ผ์๋ค๋ ๋ป์ด๋ค.
# ์์ ์ซ์๊ฐ ์ผ์ชฝ์ ์ค๋๋ก ์์ ํ ์ด์ ๋ ์๋ค๋ฅผ for๋ฌธ ๋๋ ค์ ๋ฆฌ์คํธ์ ๋ฃ์ ๊ฑฐ๋ผ ๊ฒฐ๊ตญ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ฆฌ ๋๊ฒ ๋๋ค.
1) ๋์ ๋๋ฆฌ๋ก ์ ๋ฆฌํ์
1: [2, 3]
2: [1, 5]
3: [1, 4]
4: [3, 5]
5: [2, 4]
์ซ์๋ค์ด ์๋ก ์ด๋ป๊ฒ ์ฐ๊ฒฐ ๋ผ์๋์ง ๋์ ๋๋ฆฌ๋ก ์ ๋ฆฌํด๋๊ณ , ๊ณง ๋ง๋ค ๋ฆฌ์คํธ์ ๊ฐ์ด ๋๊ณ ๋ณด๋ฉด์ ์ฝ๋๋ฅผ ์ง์ผ ํ๋ค.
tool = [[0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]
์ด๋ ๊ฒ 6 X 6์ผ๋ก ๋ list๋ฅผ ๋ง๋ ๋ค. tool์ index == ์ซ์๋ ๋ง์ถ๊ธฐ ์ํด 5 X 5๊ฐ ์๋๋ผ 6 X 6์ผ๋ก ๋ง๋ค์๋ค.
์ด์ ๋์ ๋๋ฆฌ๋ก ์ ๋ฆฌํด ๋์ ๊ฑธ ๋ณด๋ฉด์ tool์ ์ฒดํฌ๋ฅผ ํด๋ณด์.
1์ 2์ 3์ด๋ ๋ง๋๋๊น 1์ด [2]์ [3] ์๋ฆฌ์ 1๋ก ๋ฐ๊พผ๋ค.
== 1์ด 2์ 3์ด๋ ๋ง๋๋ค๋ ๊ฑด 2๋ 1๊ณผ ๋ง๋๊ณ , 3๋ 1๊ณผ ๋ง๋ ๋ค๋ ๋ป์ด๋๊น, ์๋ค๋ 1๋ก ๋ฐ๊พผ๋ค.
2๋ 1๊ณผ 5๋ฅผ ๋ง๋๋๊น 2์ด [1]์ [5] ์๋ฆฌ์ 1๋ก ๋ฐ๊พผ๋ค. ( ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฒดํฌ)
์ด๋ ๊ฒ ๋ง์ง๋ง ์ซ์ 5๊น์ง ์๋ก ์ฐ๊ฒฐ๋๋ ์ซ์๋ค์ 1๋ก ๋ฐ๊ฟ์ค๋ค.
tool = [[0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0], [0, 1, 0, 0, 0, 1], [0, 1, 0, 0, 1, 0], [0, 0, 0, 1, 0, 1], [0, 0, 1, 0, 1, 0]]
1๋ก ๋ค ๋ฐ๊ฟ์ฃผ๊ณ ๋๋ฉด ์ด๋ ๊ฒ ๋์จ๋ค.
DFS๋ BFS๋ ์ฌ๊ธฐ๊น์ง ์ดํดํ์ผ๋ฉด ๋ฐ์ ์จ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋ค. DFS์ BFS ๊ฐ๋ ์ดํด๋ ํ๊ฒ ๋๋ฐ, ์ด๊ฑธ ์ฝ๋๋ก ์ด๋ป๊ฒ ์ง์ผํ ์ง ๋ชจ๋ฅด๊ฒ ์ด์ ๋ณ ๋ฐฉ๋ฒ์ ๋ค ์จ๊ฐ๋ฉด์ ์ฝ๋๋ฅผ ์งฐ์๋๋ฐ, ์ ๋ถ ํ๋ค๊ฐ ๋งํ๋ค.
๊ฐ ์ซ์๋ค์ด ์๋ก ์ด๋ป๊ฒ ์ฐ๊ฒฐ ๋ผ์๋์ง๋ ์๊ฒ ๋๋ฐ, ๊ทธ๋์ ์ด๊ฑธ ์ด๋๋ค๊ฐ ์ ์ฅ์ ํด๋์์ผ ํ๋ฉฐ, ์ด๋ป๊ฒ ์ ์ฅ์ ํด๋์์ผ ํ๋์ง ๋ชฐ๋๋ค.
์ค๋ ๋ค๋ฅธ ํ์๋ถ์ด DFS, BFS๋ฅผ ์ ๋ ๊ฒ ๋ฆฌ์คํธ์ ๋ฃ์ด๊ฐ๋ฉด์ ์ค๋ช ์ ํด์ฃผ์ จ๋๋ฐ, ์ ๋ฆฌ์คํธ ๋ณด์๋ง์ "์, ์ ๊ฑฐ๋ค. ์ ๋ ๊ฒ ํ๋ฉด ํ ์ ์๊ฒ ๋ค" ๋ผ๋ ์๊ฐ์ด ๋ค์๋ค.
# ์ ๋ ฅ ๋ฐ์์ผ ํ ๊ฐ๋ค n, m, start_node = map(int, input().split()) # ์ฐ๊ฒฐ ์ฌ๋ถ๋ฅผ ์ฒดํฌํด ๋์ ๋ฆฌ์คํธ ์ค๋น(0๋ถํฐ ๋ฃ์ด์ ์ขํ์ฒ๋ผ ํ์ฉ) tool = [[0 for _ in range(n+1)] for _ in range(n+1)] # ๋ฒํธ๋ฅผ ๋ฐ๊ณ , ๋์ ๋๋ฆฌ๋ก ๋ง๋ ํ -> ์ฐ๊ฒฐ๋ ๋ฒํธ๋ค์ ์ขํ๋ก ๋ฃ์ด์ 1๋ก ์ฒดํฌ ํด๋์. for _ in range(m): x, y = map(int, input().split()) tool[x][y] = tool[y][x] = 1
์ฌ๊ธฐ๊น์ง์ ์ฝ๋.
DFS ๋ค ์ ๋ฆฌํ๊ณ ์๋ฌ ๊ฐ๋ ค๊ณ ํ๋๋ฐ, ๊นํ ๊ฐ์๋ ์นธ ์ํ๋ฌธ์ ๋ ํ๋ฌ ๊ฐ์ผ ํ๋ค.
๋๋จธ์ง๋ ๋ด์ผ ์ ๋ฆฌํด์ผ์ง.
# update
2021.03.18 - [HangHae99/TIL-hanghae99] - 03/18(Thu) DFS์ BFS (2)
'HangHae99 > TIL-hanghae99' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
03/19(Fri) ์ฃผํน๊ธฐ ์ฃผ์ฐจ ์์ (0) 2021.03.20 03/18(Thu) DFS์ BFS (2) (4) 2021.03.18 03/16(Tue) ์๊ณ ๋ฆฌ์ฆ[Week03] ๋ฌธ์ ํ๊ธฐ (0) 2021.03.16 03/15(Mon) ์๊ณ ๋ฆฌ์ฆ[Week03] ๋ฌธ์ ํ๊ธฐ (0) 2021.03.16 03/13(Sat) ์๊ณ ๋ฆฌ์ฆ[Week03] ๋ฌธ์ ํ๊ธฐ (0) 2021.03.14