๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ Algorithm/์•Œ๊ณ ๋ฆฌ์ฆ˜-Python

[์•Œ๊ณ ๋ฆฌ์ฆ˜/Python] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๋„คํŠธ์›Œํฌ (DFS)

by Danna 2021. 3. 6.
728x90
728x90

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

ํ’€์ด1

solution ํ•จ์ˆ˜

  • n : ์ปดํ“จํ„ฐ์˜ ๊ฐœ์ˆ˜
  • computers : ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด 2์ฐจ์› ๋ฐฐ์—ด
  • return : ๋„คํŠธ์›Œํฌ์˜ ๊ฐœ์ˆ˜

dfs ํ•จ์ˆ˜

  • graph : computers
  • v : ํ˜„์žฌ index
  • visited : ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ 1์ฐจ์› ๋ฐฐ์—ด

์ž์„ธํ•œ ํ’€์ด

  • ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ๋„คํŠธ์›Œํฌ๊ฐ€ ์žˆ์„์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ index ๋ฅผ n ๋งŒํผ ๋ฐ˜๋ณตํ•˜๋ฉฐ dfs ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  • ์ฒ˜์Œ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ƒˆ๋กœ์šด ๋„คํŠธ์›Œํฌ๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.
    • count ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ด
    • ํ˜„์žฌ index ๋ฅผ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ์‹œํ‚ด
    • ์ด๋ฏธ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ๋˜์–ด์žˆ๋‹ค๋ฉด ๋„คํŠธ์›Œํฌ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, countํ•˜์ง€ ์•Š์Œ
  • graph ๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉฐ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ, dfs ์žฌ๊ท€ํ˜ธ์ถœ
count = 0
def dfs(graph, v, visited):
    global count
    if not visited[v]:
        count += 1
        visited[v] = True

    # DFS ์ˆ˜ํ–‰
    for i, node in enumerate(graph[v]): 
        if i == v or node == 0:
            continue
        if not visited[i]:
            visited[i] = True
            dfs(graph, i, visited)

def solution(n, computers):
    global count
    count = 0
    visited = [False] * n
    for i in range(n):
        dfs(computers, i, visited)
    return count

 

ํ’€์ด2

  • index ๋ฅผ n ๋งŒํผ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ๋„คํŠธ์›Œํฌ๋ฅผ ์ฐพ๋Š”๋‹ค.
    • visited[i] == False ์ธ ๊ฒฝ์šฐ์—๋งŒ dfs ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  • dfs ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ ๋‚ด์—์„œ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ if ๋ฌธ ์ถ”๊ฐ€
    • dfs ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ if ๋ฌธ ์ œ๊ฑฐ
  • dfs ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ ๋‚ด์—์„œ count ์ฆ๊ฐ€
    • dfs ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” solution ํ•จ์ˆ˜ ๋‚ด์—์„œ count ๋ณ€์ˆ˜ ์ง€์ •
def dfs(graph, v, visited):
    # ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
    visited[v] = True 

    # DFS ์ˆ˜ํ–‰
    for i, node in enumerate(graph[v]): 
        if i == v or node == 0:
            continue
        if not visited[i]:
            dfs(graph, i, visited)

def solution(n, computers):
    count = 0
    visited = [False] * n
    for i in range(n):
        # ์ƒˆ๋กœ์šด ๋„คํŠธ์›Œํฌ๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๊ฒฝ์šฐ
        if not visited[i]: 
            dfs(computers, i, visited)
            count += 1
    return count 
    
print(solution(3, [[1, 1, 0], [1, 1, 0], [0, 0, 1]])) # return 2
print(solution(3, [[1, 1, 0], [1, 1, 1], [0, 1, 1]])) # return 1

 

์ •ํ™•์„ฑ ํ…Œ์ŠคํŠธ ๋น„๊ต

๋”๋ณด๊ธฐ

ํ’€์ด1

ํ…Œ์ŠคํŠธ 1 ใ€‰ ํ†ต๊ณผ (0.02ms, 10.2MB)
ํ…Œ์ŠคํŠธ 2 ใ€‰ ํ†ต๊ณผ (0.02ms, 10.1MB)
ํ…Œ์ŠคํŠธ 3 ใ€‰ ํ†ต๊ณผ (0.06ms, 10.1MB)
ํ…Œ์ŠคํŠธ 4 ใ€‰ ํ†ต๊ณผ (0.08ms, 10.3MB)
ํ…Œ์ŠคํŠธ 5 ใ€‰ ํ†ต๊ณผ (0.01ms, 10.3MB)
ํ…Œ์ŠคํŠธ 6 ใ€‰ ํ†ต๊ณผ (0.42ms, 10.2MB)
ํ…Œ์ŠคํŠธ 7 ใ€‰ ํ†ต๊ณผ (0.03ms, 10.2MB)
ํ…Œ์ŠคํŠธ 8 ใ€‰ ํ†ต๊ณผ (0.31ms, 10.2MB)
ํ…Œ์ŠคํŠธ 9 ใ€‰ ํ†ต๊ณผ (0.20ms, 10.3MB)
ํ…Œ์ŠคํŠธ 10 ใ€‰ ํ†ต๊ณผ (0.20ms, 10.2MB)
ํ…Œ์ŠคํŠธ 11 ใ€‰ ํ†ต๊ณผ (1.91ms, 10.2MB)
ํ…Œ์ŠคํŠธ 12 ใ€‰ ํ†ต๊ณผ (1.26ms, 10.3MB)
ํ…Œ์ŠคํŠธ 13 ใ€‰ ํ†ต๊ณผ (0.63ms, 10.2MB)

ํ’€์ด2

ํ…Œ์ŠคํŠธ 1 ใ€‰ ํ†ต๊ณผ (0.01ms, 10.2MB)
ํ…Œ์ŠคํŠธ 2 ใ€‰ ํ†ต๊ณผ (0.01ms, 10.2MB)
ํ…Œ์ŠคํŠธ 3 ใ€‰ ํ†ต๊ณผ (0.05ms, 10.1MB)
ํ…Œ์ŠคํŠธ 4 ใ€‰ ํ†ต๊ณผ (0.05ms, 10.2MB)
ํ…Œ์ŠคํŠธ 5 ใ€‰ ํ†ต๊ณผ (0.01ms, 10.1MB)
ํ…Œ์ŠคํŠธ 6 ใ€‰ ํ†ต๊ณผ (0.24ms, 10.3MB)
ํ…Œ์ŠคํŠธ 7 ใ€‰ ํ†ต๊ณผ (0.02ms, 10.2MB)
ํ…Œ์ŠคํŠธ 8 ใ€‰ ํ†ต๊ณผ (0.18ms, 10.2MB)
ํ…Œ์ŠคํŠธ 9 ใ€‰ ํ†ต๊ณผ (0.11ms, 10.1MB)
ํ…Œ์ŠคํŠธ 10 ใ€‰ ํ†ต๊ณผ (0.10ms, 10.1MB)
ํ…Œ์ŠคํŠธ 11 ใ€‰ ํ†ต๊ณผ (0.86ms, 10.3MB)
ํ…Œ์ŠคํŠธ 12 ใ€‰ ํ†ต๊ณผ (0.74ms, 10.2MB)
ํ…Œ์ŠคํŠธ 13 ใ€‰ ํ†ต๊ณผ (0.32ms, 10.1MB)

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋„คํŠธ์›Œํฌ

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

programmers.co.kr

์ด๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ

  • ๋ฌธ์ œ์—์„œ DFS / BFS ๋ฅผ ์ด์šฉํ•˜๋ผ๊ณ  ์นœ์ ˆํ•˜๊ฒŒ ์•Œ๋ ค์คฌ๋‹ค.
  • ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ "DFS / BFS ๋ฅผ ์ด์šฉํ•ด์•ผํ•œ๋‹ค" ๋Š” ํžŒํŠธ๋ฅผ ์ฐพ์•„๋ด์•ผ๊ฒ ๋‹ค.
  • BFS ํ’€์ด ์ฐธ๊ณ  - ๋งํฌ 
728x90
728x90