[Programmers] ๋„คํŠธ์›Œํฌ(BFS/DFS ํ’€์ด | Python)

    ๋ฐ˜์‘ํ˜•

    ๐ŸŒฑ ๋ฌธ์ œ

     

    ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

    ์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

    programmers.co.kr

     

    ๐ŸŒฑ ํ’€์ด

    ์ „ํ˜•์ ์ธ DFS ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด์„œ ํ‘ธ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

    0. ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”์™€ ๊ทธ๋ž˜ํ”„ ์ •๋ณด

    visited = [False for _ in range(n + 1)]
    graph = [[] for _ in range(n + 1)]
    answer = 0
    
    for i in range(len(computers)):
        for idx, val in enumerate(computers[i]):
            if i != idx and val == 1:
                graph[i + 1].append(idx + 1)
    • ์ธ์ ‘ ํ–‰๋ ฌ ๋ฐฉ์‹์œผ๋กœ ์ฃผ์–ด์ง„ ๊ทธ๋ž˜ํ”„ ์ •๋ณด๋ฅผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. (computers๋ฅผ for๋ฌธ์œผ๋กœ ๋Œ๋ฉด์„œ graph์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด๋ฅผ appendํ•ฉ๋‹ˆ๋‹ค.)
    • visited๋Š” ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•ด์ค„ ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

    1. dfs ์•Œ๊ณ ๋ฆฌ์ฆ˜

    def dfs(graph, v, visited):
        visited[v] = True
        for i in graph[v]:
            if visited[i] == False:
                dfs(graph, i, visited)
    • dfs๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ์˜ ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌํ•ด์ค๋‹ˆ๋‹ค.
    • ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜ ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•ด ์žฌ๊ท€์ ์œผ๋กœ dfs๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

    2. dfs ํƒ์ƒ‰ํ•˜๋ฉฐ ๋„คํŠธ์›Œํฌ ๊ฐœ์ˆ˜ ์„ธ๊ธฐ

     for i in range(1, len(computers) + 1):
        if visited[i] == False:
            dfs(graph, i, visited)
            answer += 1
    • ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์„ ๋ฐฉ๋ฌธํ•˜์—ฌ dfsํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
    • ๋๊นŒ์ง€ ํƒ์ƒ‰ํ•˜๊ณ  ๋‚˜์™”์„๋•Œ, answer๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

     

    ๐ŸŒฑ ์ฝ”๋“œ

    def solution(n, computers):
        visited = [False for _ in range(n + 1)]
        graph = [[] for _ in range(n + 1)]
        answer = 0
    
        for i in range(len(computers)):
            for idx, val in enumerate(computers[i]):
                if i != idx and val == 1:
                    graph[i + 1].append(idx + 1)
    
        def dfs(graph, v, visited):
            visited[v] = True
            for i in graph[v]:
                if visited[i] == False:
                    dfs(graph, i, visited)
    
        for i in range(1, len(computers) + 1):
            if visited[i] == False:
                dfs(graph, i, visited)
                answer += 1
    
        return answer

     

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€