๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ฌธ์ œ ์„ค๋ช…

๋„คํŠธ์›Œํฌ๋ž€ ์ปดํ“จํ„ฐ ์ƒํ˜ธ ๊ฐ„์— ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฐ๊ฒฐ๋œ ํ˜•ํƒœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ปดํ“จํ„ฐ A์™€ ์ปดํ“จํ„ฐ B๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๊ณ , ์ปดํ“จํ„ฐ B์™€ ์ปดํ“จํ„ฐ C๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์„ ๋•Œ ์ปดํ“จํ„ฐ A์™€ ์ปดํ“จํ„ฐ C๋„ ๊ฐ„์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํ“จํ„ฐ A, B, C๋Š” ๋ชจ๋‘ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ์ƒ์— ์žˆ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปดํ“จํ„ฐ์˜ ๊ฐœ์ˆ˜ n, ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด 2์ฐจ์› ๋ฐฐ์—ด computers๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋„คํŠธ์›Œํฌ์˜ ๊ฐœ์ˆ˜๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

ํ’€์ด1 - DFS

def DFS(n, computers, visited, i):
    visited[i] = True
    
    for j in range(n):
        if computers[i][j] ==1 and visited[j] == False:
            DFS(n, computers, visited, j)
        
def solution(n, computers):
    answer = 0
    visited = [False] * n
    for i in range(n):
        if visited[i] == False :
            DFS(n, computers, visited, i)
            answer += 1
    return answer

๋ฌธ์ œ์˜ ํ•ต์‹ฌ

1. DFS๋ฅผ ์ด์ง„ํŠธ๋ฆฌ๋กœ๋งŒ ๋ดค๋˜ ๊ฒƒ์ด ์ด ๋ฌธ์ œ์˜ ํฐ ์žฅ์• ๋ฌผ์ด ๋์Œ.

2. ๋„คํŠธ์›Œํฌ๋Š” ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ , ๊ทธ๊ฒƒ์„ ํŠธ๋ฆฌ๋กœ ๋ณด๊ณ , ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์œผ๋กœ ๋”์ด์ƒ ์—ฐ๊ฒฐ๋œ ๋…ธํŠธ๊ฐ€ ์—†๋‹ค๋ฉด, ๊ทธ๊ฒƒ์œผ๋กœ ํ•˜๋‚˜์˜ ๋„คํŠธ์›Œํฌ๋ผ๊ณ  ๋ณธ ๊ฒƒ.

 

ํ’€์ด2 - BFS

def BFS(n, computers, visited, i):
    stack = [i]
    
    while stack :
        k = stack.pop()
        if visited[k] == False:
            visited[k] = True
        for j in range(n):
            if visited[j] == False and computers[k][j] == 1 :
                stack.append(j)


def solution(n, computers):
    answer = 0 
    visited = [False] * n
    
    for i in range(n):
        if visited[i] == False:
            BFS(n, computers, visited, i )
            answer +=1
            
    return answer

 

 

ํ’€์ด3 - BFS

def BFS(n, computers):
    answer = 0
    visited =[False] * n
    
    for i in range(n):
        if visited[i] == False:
            stack =[i]
            while stack:
                k = stack.pop()
                visited[k] = True
                for j in range(n):
                    if computers[k][j] == 1 and visited[j] == False:
                        stack.append(j)
            answer +=1
    return answer

def solution(n, computers):
    return BFS(n, computers)
    
print(solution(3, [[1, 1, 0], [1, 1, 1], [0, 1, 1]]))

์˜ค๋ฅ˜ ์ด์œ 

While stack: ๋ถ€๋ถ„์—์„œ

visited[k] = True๋ฅผ ์กฐ๊ฑด๋ฌธ์—†์ด ์ผ๋‹ค.

์กฐ๊ฑด๋ฌธ ์—†์ด ์“ฐ๋‹ˆ, stack์ด ์Œ“์ธ ๋…ธ๋“œ๋“ค์˜

.... ๊ฐ€ ์•„๋‹ˆ๋ผ

 

visited[k] == True๋ผ๊ณ  ์ผ๋‹ค. ใ…กใ…ก

 

๋‚ด๊ฐ€ ์ฐพ์€ ์ด์œ ๋Š” ์ƒํ™ฉ์— ๋ผ์–ด๋งž์ถ˜ ๊ฒƒ์ด์˜€๊ณ ,

์ •ํ™•ํ•œ ์ด์œ ๋Š” ๋ฌธ๋ฒ• ์˜ค๋ฅ˜์— ์žˆ๋‹ค.

 

๊ทธ๋Ÿผ ๋‹น์—ฐํžˆ ๋ฐฉ๋ฌธ์ฒดํฌ๊ฐ€ ๋˜์ง€ ์•Š๊ณ ,

While๋ฌธ์—์„œ ์Œ“์ธ ์Šคํƒ์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์„ ๋•Œ ์Œ“์ด๋Š” 

stack.append(j)๊ฐ€ ๊ณ„์†ํ•ด์„œ ์Œ“์ด๊ณ  ๋‹ค์Œ ํ•จ์ˆ˜๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š์•„ 

BFSํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์ด none์œผ๋กœ ๋‚˜์™”๋˜ ๊ฑฐ์‹œ์˜€๋‹ค..!

๋ฐ˜์‘ํ˜•