๐[DFS] ๋คํธ์ํฌ
๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/43162
๋ฌธ์ ์ค๋ช
๋คํธ์ํฌ๋ ์ปดํจํฐ ์ํธ ๊ฐ์ ์ ๋ณด๋ฅผ ๊ตํํ ์ ์๋๋ก ์ฐ๊ฒฐ๋ ํํ๋ฅผ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ปดํจํฐ A์ ์ปดํจํฐ B๊ฐ ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด์๊ณ , ์ปดํจํฐ B์ ์ปดํจํฐ C๊ฐ ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์์ ๋ ์ปดํจํฐ A์ ์ปดํจํฐ C๋ ๊ฐ์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์ ๋ณด๋ฅผ ๊ตํํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ปดํจํฐ A, B, C๋ ๋ชจ๋ ๊ฐ์ ๋คํธ์ํฌ ์์ ์๋ค๊ณ ํ ์ ์์ต๋๋ค.
์ปดํจํฐ์ ๊ฐ์ n, ์ฐ๊ฒฐ์ ๋ํ ์ ๋ณด๊ฐ ๋ด๊ธด 2์ฐจ์ ๋ฐฐ์ด computers๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ๋คํธ์ํฌ์ ๊ฐ์๋ฅผ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํ์์ค.
์ ํ์ฌํญ
- ์ปดํจํฐ์ ๊ฐ์ n์ 1 ์ด์ 200 ์ดํ์ธ ์์ฐ์์ ๋๋ค.
- ๊ฐ ์ปดํจํฐ๋ 0๋ถํฐย
n-1
์ธ ์ ์๋ก ํํํฉ๋๋ค. - i๋ฒ ์ปดํจํฐ์ j๋ฒ ์ปดํจํฐ๊ฐ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด computers[i][j]๋ฅผ 1๋ก ํํํฉ๋๋ค.
- computer[i][i]๋ ํญ์ 1์ ๋๋ค.
์ ์ถ๋ ฅ ์
n | computers | return |
---|---|---|
3 | [[1, 1, 0], [1, 1, 0], [0, 0, 1]] | 2 |
3 | [[1, 1, 0], [1, 1, 1], [0, 1, 1]] | 1 |
๋ต์
def DFS(n, computers, com, visited):
if visited[com] == True:
return
visited[com] = True
for connect in range(n):
if connect != com and computers[com][connect] == 1:
DFS(n, computers, connect, visited)
def solution(n, computers):
answer = 0
visited = [ False for _ in range(n)]
for com in range(n):
if visited[com] == False:
DFS(n, computers, com, visited)
answer += 1
return answer
"""
# ๋ฐฑ์ค์ด๋ ide์์ ํ ๋
if __name__ == "__main__":
n = 3
computers = [[1, 1, 0], [1, 1, 0], [0, 0, 1]]
print(solution(n, computers)) # 2
n = 3
computers = [[1, 1, 0], [1, 1, 1], [0, 1, 1]]
print(solution(n, computers)) # 1
"""
ํ์ด
์ฐ์ ๋ณดํต์ ์์ ํ์ ๋ฌธ์ ๋ BFS, DFS ๋ชจ๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ๊ฒฐ๊ตญ ์์ ํ์๋ง ํ๋ฉด ๋์ด๋๊น.
์ด ๋ฒ์๋ DFS๋ก ๋ฌธ์ ๋ฅผ ํ์ด๋ดค๋ค. (๊ฒฐ๊ตญ ํผ์ ํ์ผ๋ก ํ์ง ๋ชปํ๊ณ , ๋ต์์ ์ฐธ๊ณ ํจ.. ๊ณ์ ์ด๋ ๊ฒ ํด์ ์ค๋ ฅ์ ํค์๊ฐ์)
ํ์ง๋ง ๋ณดํต ์ต๋จ๊ฑฐ๋ฆฌ
, ๋คํธ์ํฌ
๋ฑ์ ๋ฌธ์ ๋ค์ BFS๊ฐ ์ ๋ฆฌํ๋ค๊ณ ์๊ณ ์๋ค.
BFS๋ก๋ ํด๋ณด๊ธด ํจ.
์ฐ์ DFS๋ ๊ฐ์ฅ ๊น๊ฒ ๋ค์ด๊ฐ๋ค๊ฐ ๋์ค๋ ํ์ ๋ฐฉ๋ฒ์ธ๊ฑด ์๊ณ ์๋ค.
๊ทธ๋ฌ๋ฉด ๋คํธ์ํฌ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ค๋ฉด ๋คํธ์ํฌ์ ๊ตฌ์ฑ ์์์ธ ์๋ํฌ์ธํธ๊ฐ ํ์ํ๋ค.
์ฌ๊ธฐ์ ์ด๊ฑธ com
์ผ๋ก ํ๋ค. (์์ computer๋ผ๋ ์๋ฏธ๋ก)
๋์ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
def DFS(n, computers, com, visited):
if visited[com] == True:
return
visited[com] = True
for connect in range(n):
if connect != com and computers[com][connect] == 1:
DFS(n, computers, connect, visited)
- ๋ฐฉ๋ฌธ๊ธฐ๋ก(visited)์์ ์์ ๋ ธ๋์ ๋ํ ๊ฐ์ด True์ด๋ฉด return (๋ฐฉ๋ฌธ์ ํ ๋ฒ๋ง ํ๋ฏ๋ก, ์ด๋ฏธ ๋ฐฉ๋ฌธํ์ผ๋ฉด ์ฌ๊ท ์ข ๋ฃ)
- ๋ฐฉ๋ฌธ๊ธฐ๋ก์ ์๋ ๋ ธ๋๋ฉด True๋ก ๋ฐ๊ฟ์ฃผ๊ณ ๋ณธ๊ฒฉ DFS ์์
for connect in range(n)
์ผ๋ก ํ๋๋ฐ, ๋ณดํตgraph[node]
๋ฅผ ์ํํ๋๋ ์ฌ๊ธฐ์๋ ์?- ๋ฌธ์ ์์ computers๋ฅผ 2์ฐจ์ ๋ฐฐ์ด๋ก ์คฌ๊ณ , ๊ฐ ์ปดํจํฐ๋ค์ ์ธ๋ฑ์ค๊ฐ [0, 1, 2]๋๊น
range(3)
์ผ๋ก ํด๋ ๋ฌด๋ฐฉํ๊ธฐ ๋๋ฌธ์ผ๋ก ์ดํดํจ.
- ๋ฌธ์ ์์ computers๋ฅผ 2์ฐจ์ ๋ฐฐ์ด๋ก ์คฌ๊ณ , ๊ฐ ์ปดํจํฐ๋ค์ ์ธ๋ฑ์ค๊ฐ [0, 1, 2]๋๊น
- ๋ง์ฝ ์ํํ๋ computer๊ฐ DFS๋ฅผ ์คํํ๋ ์ปดํจํฐ์ธ
com
๊ณผ ๊ฐ์ง ์์์ผ ํจ.- ๊ฐ๊ฐ์ ์ปดํจํฐ๋ ์ค์ค๋ก ๋คํธ์ํฌ๊ฐ ๋ ์ ์์. ์ฆ, (0, 0), (1, 1), (2, 2)๋ ์ด์ฐจํผ 1์ (ํ์ธํ ํ์ ์์)
computers[com][connect] == 1
์ด๋ฉด- 1์ด๋ฉด ์ฐ๊ฒฐ๋์ด์๋ ๊ฑฐ๋๊น ์ฒดํฌ
- 4, 5๋ฒ ์กฐ๊ฑด ๋์์ ๋ง์กฑํ๋ฉด, DFS๋ฅผ ๋ค์ ์คํํจ.
def solution(n, computers):
answer = 0
visited = [ False for _ in range(n)]
for com in range(n):
if visited[com] == False:
DFS(n, computers, com, visited)
answer += 1
return answer
- ์ฌ๊ธฐ์๋
visited
๋ฅผ ์ ์ธํ๊ณ - for ๋ฌธ์ผ๋ก ์ํ๋ฅผ ํ๋ฉฐ DFS๋ฅผ ์คํํ๋๋ฐ..
- DFS๋ ์ฌ๊ท๋ก ๋์ํ๋๊น, ์ด DFS๊ฐ ๋์์ด ๋๋๋ฉด answer์ 1์ฆ๊ฐ ์ํค๋ฉด ๋จ.
ํ๊ณ
answer += 1
๋ถ๋ถ์ด ์ฌ์ค ์ ์ผ ์ดํด ์๋๋ ๋ถ๋ถ ์ค ํ๋์.- BFS์ ํ์ด๋ ๋ด์ผํจ..!
๋๊ธ๋จ๊ธฐ๊ธฐ