Algorithms/Algorithms

[๊ทธ๋ž˜ํ”„] ์œ„์ƒ ์ •๋ ฌ

ํƒฑ์ ค 2021. 4. 14. 03:12

๋ณต์Šต

  • ๊ทธ๋ž˜ํ”„: ๋…ธ๋“œ์™€ ๋…ธ๋“œ ์‚ฌ์ด์— ์—ฐ๊ฒฐ๋œ ๊ฐ„์„  ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ 
  • ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐœ์ฒด๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค --> ๊ฐ€์žฅ ๋จผ์ € ๊ทธ๋ž˜ํ”„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋– ์˜ฌ๋ ค์•ผํ•จ.

[๊ทธ๋ž˜ํ”„์™€ ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ ๋น„๊ต]

  ๊ทธ๋ž˜ํ”„ ํŠธ๋ฆฌ
๋ฐฉํ–ฅ์„ฑ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ or ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„
์ˆœํ™˜์„ฑ ์ˆœํ™˜ ๋ฐ ๋น„์ˆœํ™˜ ๋น„์ˆœํ™˜
๋ฃจํŠธ ๋…ธ๋“œ ์กด์žฌ ์—ฌ๋ถ€ ๋ฃจํŠธ ๋…ธํŠธ X ๋ฃจํŠธ ๋…ธ๋“œ ์กด์žฌ
๋…ธ๋“œ ๊ฐ„ ๊ด€๊ณ„์„ฑ ๋ถ€๋ชจ์™€ ์ž์‹ ๊ด€๊ณ„ ์—†์Œ ๋ถ€๋ชจ์™€ ์ž์‹ ๊ด€๊ณ„
๋ชจ๋ธ์˜ ์ข…๋ฅ˜ ๋„คํŠธ์›Œํฌ ๋ชจ๋ธ ๊ณ„์ธต ๋ชจ๋ธ

 

๊ทธ๋ž˜ํ”„์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

 

1. ์ธ์ ‘ ํ–‰๋ ฌ(Adjacency Matrix): 2์ฐจ์› ๋ฐฐ์—ด ์‚ฌ์šฉ

2. ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ(Adjacency List): ๋ฆฌ์ŠคํŠธ ์‚ฌ์šฉ

 

๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ V, ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๊ฐ€ E์ธ ๊ฒฝ์šฐ ์ธ์ ‘ ํ–‰๋ ฌ๊ณผ ์ธ์ ‘๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„ ๋น„๊ต

  ์ธ์ ‘ํ–‰๋ ฌ ์ด์šฉ ์ธ์ ‘๋ฆฌ์ŠคํŠธ ์ด์šฉ
๊ฐ„์„  ์ •๋ณด ์ €์žฅ O(V^2) ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ํ•„์š” O(E) ๋งŒํผ๋งŒ ํ•„์š”
ํŠน์ •ํ•œ ๋…ธ๋“œ A์—์„œ ๋‹ค๋ฅธ ํŠน์ •ํ•œ ๋…ธ๋“œ B๋กœ ์ด์–ด์ง„ ๊ฐ„์„ ์˜ ๋น„์šฉ ์•„๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ O(1)์˜ ์‹œ๊ฐ„์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ์Œ O(V)์˜ ์‹œ๊ฐ„์ด ์†Œ์š”

์œ„์ƒ ์ •๋ ฌ

  • ์ˆœ์„œ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๋Š” ์ผ๋ จ์˜ ์ž‘์—…์„ ์ฐจ๋ก€๋Œ€๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ '๋ฐฉํ–ฅ์„ฑ์— ๊ฑฐ์Šค๋ฅด์ง€ ์•Š๋„๋ก ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ
  • ๊ทธ๋ž˜ํ”„์ƒ์—์„œ ์„ ํ›„ ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค๋ฉด ์œ„์ƒ ์ •๋ ฌ ์ˆ˜ํ–‰ํ•ด ๋ชจ๋“  ์„ ํ›„ ๊ด€๊ณ„๋ฅผ ์ง€ํ‚ค๋Š” ์ „์ฒด ์ˆœ์„œ๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Œ

โ€ป ์ง„์ž… ์ฐจ์ˆ˜๋ž€? ํŠน์ •ํ•œ ๋…ธ๋“œ๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜

 

์œ„์ƒ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  1. ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ๋Š”๋‹ค.
  2. ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋‹ค์Œ์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
    • ํ์—์„œ ์›์†Œ๋ฅผ ๊บผ๋‚ด ํ•ด๋‹น ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜๋Š” ๊ฐ„์„ ์„ ๊ทธ๋ž˜ํ”„์—์„œ ์ œ๊ฑฐ
    • ์ƒˆ๋กญ๊ฒŒ ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ด ๋œ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ๊ธฐ

์ด๋Ÿฐ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๊ฐ€ ์žˆ๋‹ค๋ฉด

์ง„์ž… ์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ๊ณ 

ํ•˜๋‚˜์”ฉ ์›์†Œ๋ฅผ ๋นผ๊ฐ€๋ฉฐ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ.

์œ„์˜ ์˜ˆ์‹œ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

from collections import deque

# ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜์™€ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ž…๋ ฅ ๋ฐ›๊ธฐ
v, e = map(int, input().split())
# ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ง„์ž…์ฐจ์ˆ˜๋Š” 0์œผ๋กœ ์ดˆ๊ธฐํ™”
indegree = [0] * (v + 1)
# ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ๊ฐ„์„  ์ •๋ณด๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
graph = [[] for i in range(v + 1)]

# ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ ๋ฐ›๊ธฐ
for _ in range(e):
    a, b = map(int, input().split())
    graph[a].append(b) # ์ •์  A์—์„œ B๋กœ ์ด๋™ ๊ฐ€๋Šฅ
    # ์ง„์ž… ์ฐจ์ˆ˜๋ฅผ 1 ์ฆ๊ฐ€
    indegree[b] += 1

# ์œ„์ƒ ์ •๋ ฌ ํ•จ์ˆ˜
def topology_sort():
    result = [] # ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ ๋ฆฌ์ŠคํŠธ
    q = deque() # ํ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ

    # ์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ๋Š” ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…
    for i in range(1, v + 1):
        if indegree[i] == 0:
            q.append(i)

    # ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
    while q:
        # ํ์—์„œ ์›์†Œ ๊บผ๋‚ด๊ธฐ
        now = q.popleft()
        result.append(now)
        # ํ•ด๋‹น ์›์†Œ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค์˜ ์ง„์ž…์ฐจ์ˆ˜์—์„œ 1 ๋นผ๊ธฐ
        for i in graph[now]:
            indegree[i] -= 1
            # ์ƒˆ๋กญ๊ฒŒ ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ด ๋˜๋Š” ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…
            if indegree[i] == 0:
                q.append(i)

    # ์œ„์ƒ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
    for i in result:
        print(i, end=' ')

topology_sort()

์œ„์ƒ์ •๋ ฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„

  • ์ฐจ๋ก€๋Œ€๋กœ ๋ชจ๋“  ๋…ธ๋“œ ํ™•์ธํ•˜๋ฉด์„œ ํ•ด๋‹น ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜๋Š” ๊ฐ„์„ ์„ ์ฐจ๋ก€๋Œ€๋กœ ์ œ๊ฑฐํ•ด์•ผํ•จ
  • O(V+E)

N๊ฐœ์˜ ๊ฐ•์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, N๊ฐœ์˜ ๊ฐ•์˜์— ๋Œ€ํ•ด ์ˆ˜๊ฐ•ํ•˜๊ธฐ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„ ๊ตฌํ•˜๊ธฐ

์ž…๋ ฅ: ์ฒซ์งธ ์ค„์— ๋“ฃ๊ณ ์ž ํ•˜๋Š” ๊ฐ•์˜์˜ ์ˆ˜ N ์ฃผ์–ด์ง / ๋‹ค์Œ N๊ฐœ์˜ ์ค„์— ๊ฐ ๊ฐ•์˜์˜ ๊ฐ•์˜ ์‹œ๊ฐ„๊ณผ ๊ทธ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ธฐ ์œ„ํ•ด ๋จผ์ € ๋“ค์–ด์•ผ ํ•˜๋Š” ๊ฐ•์˜๋“ค์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ž์—ฐ์ˆ˜๋กœ ์ฃผ์–ด์ง€๋ฉฐ ๊ฐ ์ž์—ฐ์ˆ˜๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„.

์ถœ๋ ฅ: N๊ฐœ์˜ ๊ฐ•์˜์— ๋Œ€ํ•ด ์ˆ˜๊ฐ•ํ•˜๊ธฐ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ถœ๋ ฅ

# ์ž…๋ ฅ์˜ˆ์‹œ
5
10 -1
10 1 -1
4 1 -1
4 3 1 -1
3 3 -1

# ์ถœ๋ ฅ์˜ˆ์‹œ
10
20
14
18
17
from collections import deque
import copy

# ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ ์ž…๋ ฅ๋ฐ›๊ธฐ
v = int(input())
# ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ง„์ž…์ฐจ์ˆ˜๋Š” 0์œผ๋กœ ์ดˆ๊ธฐํ™”
indegree = [0] * (v + 1)
# ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ๊ฐ„์„  ์ •๋ณด๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(๊ทธ๋ž˜ํ”„) ์ดˆ๊ธฐํ™”
graph = [[] for i in range(v + 1)]
# ๊ฐ ๊ฐ•์˜ ์‹œ๊ฐ„์„ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
time = [0] * (v + 1)

# ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
for i in range(1, v + 1):
    data = list(map(int, input().split()))
    time[i] = data[0] # ์ฒซ ๋ฒˆ์งธ ์ˆ˜๋Š” ์‹œ๊ฐ„ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Œ
    for x in data[1:-1]:
        indegree[i] += 1
        graph[x].append(i)

# ์œ„์ƒ ์ •๋ ฌ ํ•จ์ˆ˜
def topology_sort():
    result = copy.deepcopy(time) # ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ ๋ฆฌ์ŠคํŠธ
    q = deque() # ํ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ

    # ์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ๋Š” ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…
    for i in range(1, v + 1):
        if indegree[i] == 0:
            q.append(i)

    # ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
    while q:
        # ํ์—์„œ ์›์†Œ ๊บผ๋‚ด๊ธฐ
        now = q.popleft()
        # ํ•ด๋‹น ์›์†Œ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค์˜ ์ง„์ž…์ฐจ์ˆ˜์—์„œ 1 ๋นผ๊ธฐ
        for i in graph[now]:
            result[i] = max(result[i], result[now] + time[i])
            indegree[i] -= 1
            # ์ƒˆ๋กญ๊ฒŒ ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ด ๋˜๋Š” ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…
            if indegree[i] == 0:
                q.append(i)

    # ์œ„์ƒ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
    for i in range(1, v + 1):
        print(result[i])

topology_sort()
# ์œ„์˜ ์ฝ”๋“œ ์‹คํ–‰ ๊ฒฐ๊ณผ graph ๋ณ€์ˆ˜์™€ indegree์— ๋‹ด๊ฒจ์žˆ๋Š” ๊ฐ’
graph = [[], [2, 3, 4], [], [4, 5], [], []]
indegree = [0, 0, 1, 1, 2, 1]

[์ถœ์ฒ˜] ํ•œ๋น›๋ฏธ๋””์–ด- "์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ" ๋‚˜๋™๋นˆ ์ €์ž

728x90