๐[BFS] ๋คํธ์ํฌ
๋ฌธ์
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 BFS(n, computers, com, visited):
from collections import deque
queue = deque([com])
while queue:
v = queue.popleft()
visited[v] = True
for c in range(n):
if v != c and computers[v][c] == 1:
if visited[c] == False:
queue.append(c)
def solution(n, computers):
answer = 0
visited = [ False for _ in range(n)]
for com in range(n):
if visited[com] == False:
BFS(n, computers, com, visited)
answer += 1
return answer
ํ์ด
DFS๊ฐ ํ ๋๋ง ํจ๋ ๋ฐฉ์์ด๋ผ๋ฉด, BFS๋ ํ ๋์ฉ ๋๋ ค๊ฐ๋ฉด์ ํธ๋ ๋ฐฉ์์.
BFS์ ๋์ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
def BFS(n, computers, com, visited):
from collections import deque
queue = deque([com])
while queue:
v = queue.popleft()
visited[v] = True
for c in range(n):
if v != c and computers[v][c] == 1:
if visited[c] == False:
queue.append(c)
queue
๋ฅผ ์ ์ธํจ.- queue๊ฐ ์กด์ฌํ์ง ์๊ฒ ๋ ๋๊น์ง ๋ฐ๋ณต.
- queue์ ์ ์ฅํ๋ ๊ฐ ์ค ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ ๊ฐ์ ๊บผ๋.
- ๋ฐฉ๋ฌธ๊ธฐ๋ก์ ํด๋น ๊ฐ์ ๋ํ ์ ๋ณด๋ฅผ True๋ก ๋ฐ๊ฟ.
- n โ 0, 1, 2, โฆ n-1 ๊น์ง ์ํ (computers์ index)
- v ๊ฐ ์ํํ ๊ฐ(c)๊ณผ ๊ฐ์ง ์์ผ๋ฉด์, computers[v][c] == 1์ด๋ฉด?
- c์ ๋ํ ๋ฐฉ๋ฌธ๊ธฐ๋ก ์กฐํ โ False๋ฉด?
- queue์ c๋ฅผ ์ ์ฅํด์ ๋ค์ ๋ฐ๋ณต
BFS์ ์คํ ์์๋ฅผ ๊ธธ์ง๋ง ์์ธํ๊ฒ ๋ค์ ํด๋ณด๋ฉด?? (n=3, computers=[[1, 1, 0], [1, 1, 0], [0, 0, 1]] ์ผ ๋๋ง ๊ฐ์
n = 3
computers = [
[1, 1, 0],
[1, 1, 0],
[0, 0, 1]
]
์ด๋ฐ ์ํฉ์.
์ฆ, 0 โ 1 ์ฐ๊ฒฐ, 2๋ ์๊ธฐ ์์ ๋ง ์ฐ๊ฒฐ๋ ๋ ๋ฆฝ ๋ ธ๋.
solution
์์ for com in range(n)
๋ฅผ ํ๋ฏ๋ก com=0
๋ถํฐ ์์.
- ์์ (com = 0)
- visited = [False, False, False]
-
BFS ์์: queue = [0]
queue = [0] visited = [False, False, False]
- pop (0 ๊บผ๋)
- v = queue.popleft() โ v = 0
-
๋ฐฉ๋ฌธ์ฒ๋ฆฌ โ visited[0] = True
queue = [] visited = [True, False, False]
- for๋ฌธ ์คํ
- computers[0] = [1, 1, 0]
- c=1 ์ฐ๊ฒฐ๋์ด ์๊ณ , ์์ง ๋ฐฉ๋ฌธํ์ง ์์์.
-
queue.append(1) ์ํ
queue = [1]
- while๋ฌธ ์ํ - pop (1 ๊บผ๋)
- v = queue.popleft() โ v = 1
-
๋ฐฉ๋ฌธ์ฒ๋ฆฌ โ visited[1] = True
queue = [] visited = [True, True, False]
- for๋ฌธ ์คํ
- computers[1] = [1, 1, 0]
- c=0์ ์ด๋ฏธ ๋ฐฉ๋ฌธํ์ โ ๋ฌด์ํ๊ณ ๋์ด๊ฐ
-
c=2๋ ์ฐ๊ฒฐ์ด ์๋์ด์์ (computers[0][2] == 0) โ ์๋ฌด๋ฐ ์ถ๊ฐ ๋์ ์ํ ์ํจ
queue = [] visited = [True, True, False]
-
while๋ฌธ ์ํ โ ์ด์ ๋จ๊ณ์์ queue์ ์๋ฌด ๊ฐ๋ ์๋ฃ์ด ๋น ์ํ์
queue = [] visited = [True, True, False]
- BFS ๋ โ 0๋ฒ ์ปดํจํฐ๋ฅผ ์์์ผ๋ก ํ ์ฐ๊ฒฐ๋ ๋คํธ์ํฌ ํ์ ์๋ฃ
- answer += 1
- ๋ค์ com = 1
- com = 0 ๋จ๊ณ์์
visited[1] = True
๋ก ์ค์ ๋จ. -
solution
๋จ๊ณ์์ visited[1] = True์ด๋ฏ๋ก ๋์ด๊ฐ.for com in range(n): if visited[com] == False: BFS(n, computers, com, visited) answer += 1
- com = 0 ๋จ๊ณ์์
-
๋ค์ com = 2
visited = [True, True, False]
visited[2] = False
์ด๋ฏ๋ก BFS ์์
queue = [2] visited = [True, True, False]
- pop (2 ๊บผ๋)
- queue.popleft() โ v = 2
-
visited[2] = True ์ํ
queue = [] visited = [True, True, True]
- for๋ฌธ ์ํ
-
computers[2] = [0, 0, 1] โ ์๊ธฐ ์์ ๋ฐ์ ์์
for c in range(n): # v = 2 if v != c and computers[v][c] == 1: # computers[2][2]๋ง 1์ if visited[c] == False: # visited[0], visited[1], visited[2] ๋ชจ๋ True queue.append(c)
-
์ฌ๊ธฐ์ ๊ฑธ๋ฆผ โ BFS ์ข ๋ฃ
computers[2][2]๋ง 1
์ด๋ฏ๋ก c=2์ผ ๋๋ง ์ฒซ ๋ฒ์งธ if๋ฌธ ํต๊ณผvisited[2] = True
์ด๋ฏ๋ก ๋ ๋ฒ์งธ if ๋ฌธ์์ ํ๋ฝ- BFS ์ข ๋ฃ
- answer += 1
-
ํ๊ณ
- ๋์ ์์์ ๋ํด ํ๋ํ๋ ์ ์ผ๋ฉด์ ํ์!
๋๊ธ๋จ๊ธฐ๊ธฐ