๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/์ฝ”๋“œ์—…(Code up)

[ ํŒŒ์ด์ฌ(python) ] ์ฝ”๋“œ์—… 4503 - ๋ฐ”์ด๋Ÿฌ์Šค(DFS)

by YWTechIT 2021. 4. 14.
728x90

๐Ÿ“Œ ์ฝ”๋“œ์—… 4503 - ๋ฐ”์ด๋Ÿฌ์Šค

๋ฌธ์ œ ์„ค๋ช…


๐Ÿ’ก ๋‚˜์˜ ํ’€์ด

์ด ๋ฌธ์ œ์˜ ๋‹ค์–‘ํ•œ ํ’€์ด๊ฐ€ ์žˆ๊ฒ ์ง€๋งŒ, ์šฐ์„  DFS๋กœ ํ’€์–ด๋ดค๋‹ค. ๋‚ด์ผ์€ BFS๋กœ ํ’€์–ด ๋ณผ ์˜ˆ์ •์ด๋‹ค.

 

๋น„ ์„ ํ˜•์ž๋ฃŒ๊ตฌ์กฐ์ธ ๊ทธ๋ž˜ํ”„์—์„œ์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ์™€ ๋‹ค๋ฅด๊ฒŒ ์ž…๋ ฅ์„ ๋ฐ›์„๋•Œ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ›์•„์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.


์ด๋ฒˆ ๋ฌธ์ œ์—์„œ ์ž…๋ ฅ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ๋ฐ›์•„์•ผ ํ•˜๋Š”์ง€ ์กฐ๊ธˆ ํ—ท๊ฐˆ๋ ธ๋Š”๋ฐ, ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ›์œผ๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ •๋‹ต ํŒ์ •์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ์ปดํ“จํ„ฐ๋งŒ ๋ฐ”์ด๋Ÿฌ์Šค์— ๊ฑธ๋ฆฐ๋‹ค๊ณ  ํ–ˆ์œผ๋ฏ€๋กœ DFS๋ฅผ ํ†ตํ•ด ๋‚˜์˜จ๊ฐ’๋“ค์˜ len์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.

 

๋˜, DFS๋ฅผ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์—๋Š” 2๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์ด์ฝ”ํ…Œ์—์„œ ๋ฐฐ์šด ๋ฐฉ๋ฒ•: Flag: if not visited[i]
    visited๋ฅผ ๋ชจ๋‘ [False]๋กœ ์ดˆ๊ธฐํ™”ํ•ด๋‘๊ณ  ํ˜„์žฌ ๋ฐฉ๋ฌธํ•˜๋ ค๋Š” ๊ฐ’์ด False์ด๋ฉด, ํ•ด๋‹น ๊ฐ’์„ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ์ธ True๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ๋‹ค.

 

  1. ๋‹จ์ˆœ ํ™•์ธ๋ฐฉ๋ฒ•: check: if i not in visited
    visited์•ˆ์— ํ˜„์žฌ ๊ฐ’๊ณผ ๋˜‘๊ฐ™์€ ๊ฐ’์ด ์—†์œผ๋ฉด ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•œ๋‹ค.
    ๋‹จ์ˆœ ํ™•์ธ๋ฐฉ๋ฒ•์€ ์ œ์ผ ์ฒซ ๋ฒˆ์งธ ๊ฐ’๋„ ํฌํ•จ๋˜๋ฏ€๋กœ ๋ฌธ์ œ์—์„œ๋Š” ๊ธฐ์ค€์ด ๋˜๋Š” ๊ฐ’์„ ์ œ์™ธํ•˜๊ณ  ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ len(result)-1์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
# 1. Flag ๋ฐฉ๋ฒ•
def dfs(graph, v, visited):
    visited[v] = True
    for i in graph[v]:
        if not visited[i]:
            result.append(i)
            dfs(graph, i, visited)

computer = int(input())
network = int(input())
graph = [[] for _ in range(computer+1)]
result = []
visited = [False] * (computer+1)

for i in range(network): # ๊ทธ๋ž˜ํ”„๋Š” ์–‘๋ฐฉํ–ฅ์ด๋‹ˆ๊นŒ ๊ฑฐ๊พธ๋กœ๋„ ์ถ”๊ฐ€์‹œ์ผœ์•ผํ•œ๋‹ค.
    node, node2 = map(int, input().split())
    graph[node].append(node2)
    graph[node2].append(node)

dfs(graph, 1, visited)
print(len(result))

# 2. ๋‹จ์ˆœ ํ™•์ธ(check) ๋ฐฉ๋ฒ•
def dfs(graph, v, visited):
    for i in graph[v]:
        if i not in visited:
            visited.append(i)
            dfs(graph, i, visited)

computer = int(input())
network = int(input())
graph = [[] for _ in range(computer+1)]
visited = []

for i in range(network): # ๊ทธ๋ž˜ํ”„๋Š” ์–‘๋ฐฉํ–ฅ์ด๋‹ˆ๊นŒ ๊ฑฐ๊พธ๋กœ๋„ ์ถ”๊ฐ€์‹œ์ผœ์•ผํ•œ๋‹ค.
    node, node2 = map(int, input().split())
    graph[node].append(node2)
    graph[node2].append(node)

dfs(graph, 1, visited)
print(len(visited)-1)
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€