3 ๋ถ„ ์†Œ์š”

๋ฌธ์ œ

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)
  1. queue๋ฅผ ์„ ์–ธํ•จ.
  2. queue๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ฒŒ ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต.
  3. queue์— ์ €์žฅํ–ˆ๋˜ ๊ฐ’ ์ค‘ ๊ฐ€์žฅ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์„ ๊บผ๋ƒ„.
  4. ๋ฐฉ๋ฌธ๊ธฐ๋ก์— ํ•ด๋‹น ๊ฐ’์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ True๋กœ ๋ฐ”๊ฟˆ.
  5. n โ†’ 0, 1, 2, โ€ฆ n-1 ๊นŒ์ง€ ์ˆœํšŒ (computers์˜ index)
  6. v ๊ฐ€ ์ˆœํšŒํ•œ ๊ฐ’(c)๊ณผ ๊ฐ™์ง€ ์•Š์œผ๋ฉด์„œ, computers[v][c] == 1์ด๋ฉด?
  7. c์— ๋Œ€ํ•œ ๋ฐฉ๋ฌธ๊ธฐ๋ก ์กฐํšŒ โ†’ False๋ฉด?
  8. 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๋ถ€ํ„ฐ ์‹œ์ž‘.

  1. ์‹œ์ž‘ (com = 0)
    • visited = [False, False, False]
    • BFS ์‹œ์ž‘: queue = [0]

        queue = [0]
        visited = [False, False, False]
      
  2. pop (0 ๊บผ๋ƒ„)
    • v = queue.popleft() โ†’ v = 0
    • ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ โ†’ visited[0] = True

        queue = []
        visited = [True, False, False]
      
  3. for๋ฌธ ์‹คํ–‰
    • computers[0] = [1, 1, 0]
    • c=1 ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ , ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์Œ.
    • queue.append(1) ์ˆ˜ํ–‰

        queue = [1]
      
  4. while๋ฌธ ์ˆ˜ํ–‰ - pop (1 ๊บผ๋ƒ„)
    • v = queue.popleft() โ†’ v = 1
    • ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ โ†’ visited[1] = True

        queue = []
        visited = [True, True, False]
      
  5. for๋ฌธ ์‹คํ–‰
    • computers[1] = [1, 1, 0]
    • c=0์€ ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ์Œ โ†’ ๋ฌด์‹œํ•˜๊ณ  ๋„˜์–ด๊ฐ
    • c=2๋Š” ์—ฐ๊ฒฐ์ด ์•ˆ๋˜์–ด์žˆ์Œ (computers[0][2] == 0) โ†’ ์•„๋ฌด๋Ÿฐ ์ถ”๊ฐ€ ๋™์ž‘ ์ˆ˜ํ–‰ ์•ˆํ•จ

        queue = []
        visited = [True, True, False]
      
  6. while๋ฌธ ์ˆ˜ํ–‰ โ†’ ์ด์ „ ๋‹จ๊ณ„์—์„œ queue์— ์•„๋ฌด ๊ฐ’๋„ ์•ˆ๋„ฃ์–ด ๋นˆ ์ƒํƒœ์ž„

     queue = []
     visited = [True, True, False]
    
    • BFS ๋ โ†’ 0๋ฒˆ ์ปดํ“จํ„ฐ๋ฅผ ์‹œ์ž‘์œผ๋กœ ํ•œ ์—ฐ๊ฒฐ๋œ ๋„คํŠธ์›Œํฌ ํƒ์ƒ‰ ์™„๋ฃŒ
    • answer += 1
  7. ๋‹ค์Œ 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
      
  8. ๋‹ค์Œ com = 2

     visited = [True, True, False]
    
    • visited[2] = False์ด๋ฏ€๋กœ BFS ์‹œ์ž‘
     queue = [2]
     visited = [True, True, False]
    
  9. pop (2 ๊บผ๋ƒ„)
    • queue.popleft() โ†’ v = 2
    • visited[2] = True ์ˆ˜ํ–‰

        queue = []
        visited = [True, True, True]
      
  10. 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

ํšŒ๊ณ 

  • ๋™์ž‘ ์ˆœ์„œ์— ๋Œ€ํ•ด ํ•˜๋‚˜ํ•˜๋‚˜ ์ ์œผ๋ฉด์„œ ํ•˜์ž!

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ