Skip to content

BOJ 1766 ๋ฌธ์ œ์ง‘ ํ’€์ดย #2

@allzeroyou

Description

@allzeroyou

๋ฌธ์ œ ๋ถ„์„

์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„(๋ฌธ์ œ ์š”์•ฝ ๋ฐ ์กฐ๊ฑด ํŒŒ์•…)

1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€ ์ด N๊ฐœ์˜ ๋ฌธ์ œ๋กœ ๋œ ๋ฌธ์ œ์ง‘์„ ํ’€๋ ค๊ณ  ํ•จ.

๋ฌธ์ œ ๋‚œ์ด๋„๋Š” ์ˆœ์„œ๋Œ€๋กœ. 1๋ฒˆ๋ฌธ์ œ๊ฐ€ ๊ฐ€์žฅ ์‰ฌ์šด ๋ฌธ์ œ, n๋ฒˆ ๋ฌธ์ œ๊ฐ€ ๊ฐ€์žฅ ์–ด๋ ค์šด ๋ฌธ์ œ์ž„.

๋จผ์ € ํ’€๋ฉด ์ข‹์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ๋˜์–ด, 3๊ฐ€์ง€ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋ฌธ์ œํ’€์ด ์ง„ํ–‰.

  1. n๊ฐœ์˜ ๋ฌธ์ œ๋Š” ๋ชจ๋‘ ํ’€์–ด์•ผ ํ•จ
  2. ๋จผ์ € ํ‘ธ๋Š” ๊ฒƒ์ด ์ข‹์€ ๋ฌธ์ œ๋Š” ๋ฐ˜๋“œ์‹œ ๋จผ์ € ํ’€์–ด์•ผ ํ•จ(=์„ ์ˆ˜ ๋ฌธ์ œ๋ฅผ ๋”ฐ๋ผ์•ผ ํ•จ)
  3. ๊ฐ€๋Šฅํ•˜๋ฉด ์‰ฌ์šด ๋ฌธ์ œ ๋ถ€ํ„ฐ ํ’€์–ด์•ผ ํ•จ

e.g.) 4๊ฐœ์˜ ๋ฌธ์ œ, 4๋ฒˆ ๋ฌธ์ œ๋Š” 2๋ฒˆ ๋ฌธ์ œ๋ณด๋‹ค ๋จผ์ € ํ‘ธ๋Š” ๊ฒƒ์ด ์ข‹๊ณ  3๋ฒˆ ๋ฌธ์ œ๋Š” 1๋ฒˆ ๋ฌธ์ œ๋ณด๋‹ค ๋จผ์ € ํ‘ธ๋Š” ๊ฒƒ์ด ์ข‹์Œ.

๋งŒ์ผ 4-3-2-1 ์ˆœ์„œ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€๊ฒŒ๋˜๋ฉด, ์กฐ๊ฑด 1,2๋Š” ๋งŒ์กฑํ•˜๋˜, ์กฐ๊ฑด 3์€ ๋งŒ์กฑ๋ชปํ•จ.(3์€ 4๋ณด๋‹ค ์‰ฝ๊ธฐ์— ๋จผ์ € ํ’€์–ด์•ผ ํ•จ)

๋”ฐ๋ผ์„œ ์กฐ๊ฑด 3๊ฐ€์ง€๋ฅผ ๋งŒ์กฑํ•˜๋ ค๋ฉด 3-1-4-2๊ฐ€ ๋œ๋‹ค.

  • ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋ฌธ์ œ์˜ ์ˆ˜ n(1โ‰คnโ‰ค32000)์™€ ์„ ์ˆ˜ ๋ฌธ์ œ์˜ ๊ฐœ์ˆ˜ m(1โ‰คmโ‰ค100,000)

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ m๊ฐœ ์ค„์— ๊ฑธ์ณ ๋‘ ์ •์ˆ˜ a,b๊ฐ€ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง.

์ด๋•Œ a๋Š” b๋ณด๋‹ค ๋จผ์ € ํ‘ธ๋Š”๊ฒŒ ์ข‹์Œ.

ํ•ญ์ƒ ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ํ’€ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง.

  • ์ถœ๋ ฅ

๋ฌธ์ œ๋ฒˆํ˜ธ๋ฅผ ํ’€์–ด์•ผ ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋นˆ์นธ์„ ๋‘๊ณ  ์ถœ๋ ฅ

๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„ (๋ฌธ์ œ ํ•ต์‹ฌ ํŒŒ์•…)

๋จผ์ € ํ’€์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋งˆ์น˜ ๋Œ€ํ•™๊ต ๊ณผ๋ชฉ์—์„œ ์„ ์ˆ˜๊ณผ๋ชฉ์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ฌด์กฐ๊ฑด ์„ ์ˆ˜๊ด€๊ณ„๋ฅผ ์ง€์ผœ์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋”ฐ๋ผ์„œ, ์„ ์ˆ˜๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๊ทธ๋ž˜ํ”„ ๋กœ ๋– ์˜ฌ๋ ค๋ณด์ž.

3๋ฒˆ ๋…ธ๋“œ โ†’ 1๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ด.

4๋ฒˆ ๋…ธ๋“œ โ†’ 2๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ด.

์ด๋•Œ 3๋ฒˆ ๋…ธ๋“œ๋ž‘ 4๋ฒˆ ๋…ธ๋“œ ์ค‘์— ๋” ์‰ฌ์šด ๋ฌธ์ œ๋Š” 3๋ฒˆ ๋…ธ๋“œ์ž„.

3๋ฒˆ ๋…ธ๋“œ๋ฅผ ํ’€๊ณ , 1๋ฒˆ ๋…ธ๋“œ์™€ 4๋ฒˆ ๋…ธ๋“œ ์ค‘ ๋จผ์ € ํ’€์–ด์•ผ ํ•˜๋Š” ๊ฑด 1๋ฒˆ ๋…ธ๋“œ์ด๊ธฐ์— 1๋ฒˆ ๋…ธ๋“œ๋ฅผ ํ‘ผ๋‹ค.

๋‚จ์€ ๊ฑด 2, 4๋ฒˆ ๋…ธ๋“œ์ด๊ธฐ์—, 4๋ฒˆ ๋…ธ๋“œ๋ฅผ ํ’€๊ณ  2๋ฒˆ ๋…ธ๋“œ๋ฅผ ํ‘ผ๋‹ค.

์‚ฌ์ดํด์ด ์—†์œผ๋ฉฐ ์ˆœ์„œ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๋Š” ์ผ๋ จ์˜ ์ž‘์—…์„ ์ฐจ๋ก€๋Œ€๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ ์œ„์ƒ ์ •๋ ฌ

์œ„์ƒ ์ •๋ ฌ์€ ์ง„์ž… ์ฐจ์ˆ˜, ์ง„์ถœ ์ฐจ์ˆ˜์˜ ๊ฐœ๋…์„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

  • ์ง„์ž… ์ฐจ์ˆ˜(indegree): ํŠน์ • ๋…ธ๋“œ๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฐ„์„  ๊ฐœ์ˆ˜
  • ์ง„์ถœ ์ฐจ์ˆ˜(outdegree): ํŠน์ • ๋…ธ๋“œ์—์„œ ๋‚˜๊ฐ€๋Š” ๊ฐ„์„  ๊ฐœ์ˆ˜
    ์œ„์ƒ ์ •๋ ฌ์˜ ๋™์ž‘ ๊ณผ์ •

ํ๋ฅผ ์ด์šฉํ•˜๋Š”ย ์œ„์ƒ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋™์ž‘ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

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

=>ย ๊ฒฐ๊ณผ ์ ์œผ๋กœย ๊ฐ ๋…ธ๋“œ๊ฐ€ ํ์— ๋“ค์–ด์˜จ ์ˆœ์„œ๊ฐ€ ์œ„์ƒ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ์™€ ๊ฐ™๋‹ค

์œ„์ƒ ์ •๋ ฌ์˜ ํŠน์ง•

  • ์œ„์ƒ ์ •๋ ฌ์€ DAG์— ๋Œ€ํ•ด์„œ๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค
    • DAG (Direct Acyclic Graph):ย ์ˆœํ™˜ํ•˜์ง€ ์•Š๋Š” ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„
  • ์œ„์ƒ ์ •๋ ฌ์—์„œ๋Š”ย ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹ต์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค
    • ํ•œ ๋‹จ๊ณ„์—์„œ ํ์— ์ƒˆ๋กญ๊ฒŒ ๋“ค์–ด๊ฐ€๋Š” ์›์†Œ๊ฐ€ 2๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹ต์ด ์กด์žฌํ•œ๋‹ค
  • ๋ชจ๋“  ์›์†Œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ธฐ ์ „์— ํ๊ฐ€ ๋นˆ๋‹ค๋ฉด ์‚ฌ์ดํด์ด ์กด์žฌํ•œ๋‹ค๊ณ  ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค
    • ์‚ฌ์ดํด์— ํฌํ•จ๋œ ์›์†Œ ์ค‘์—์„œ ์–ด๋– ํ•œ ์›์†Œ๋„ ํ์— ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•œ๋‹ค
  • ์Šคํƒ์„ ํ™œ์šฉํ•œ DFS๋ฅผ ์ด์šฉํ•ด ์œ„์ƒ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ๋‹ค

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-09-11 แ„‹แ…ฉแ„’แ…ฎ 11 01 52

ํ๊ฐ€ ์•„๋‹ˆ๋ผ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ํ์ธ heapq ๋ฅผ ์ด์šฉํ•ด ์œ„์ƒ์ •๋ ฌ์„ ๊ตฌํ˜„ํ•˜๊ฒ ์Œ.

3๋ฒˆ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ํ›„ 1, 4๋ฒˆ ๋…ธ๋“œ ์ค‘ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ 1๋ฒˆ ๋…ธ๋“œ๋ฅผ ๋จผ์ € ํ’€์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํŒŒ์ด์ฌ์˜ heapq๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ตœ์†Œํž™์ด๊ธฐ์— ๋„ฃ์—ˆ๋‹ค๊ฐ€ ๋นผ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์ด ๋œ๋‹ค.

์ฝ”๋“œ ์ž‘์„ฑ

import heapq

n, m = map(int, input().split())

# ์œ„์ƒ์ •๋ ฌ ๊ทธ๋ž˜ํ”„
graph = [[] for _ in range(n + 1)]  # 1-based
# ์ง„์ž… ์ฐจ์ˆ˜ ๋ฆฌ์ŠคํŠธ
indegree = [0 for _ in range(n + 1)]
# ์šฐ์„ ์ˆœ์œ„ ํ
que = []

# ์„ ์ˆ˜๋ฌธ์ œ
for _ in range(m):
    first, last = map(int, input().split())
    graph[first].append(last)
    indegree[last] += 1  # ์ง„์ž…์ฐจ์ˆ˜ + 1 ํ•ด์ค€๋‹ค


# ์œ„์ƒ์ •๋ ฌ
def topology_sort():
    # ์ •๋‹ต ๋‹ด์„ ๋ฆฌ์ŠคํŠธ
    res = []
    # 1. ์ง„์ž… ์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ๋ถ€ํ„ฐ ํ์— ์‚ฝ์ž…
    for i in range(1, n + 1):
        if indegree[i] == 0:
            heapq.heappush(que, i)
    # 2. ํ๊ฐ€ ๋นŒ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
    while que:
        # ํ์—์„œ ์›์†Œ ๊บผ๋‚ด๊ธฐ
        now = heapq.heappop(que)  # ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ํ›„ ์ถ”์ถœ
        res.append(now)
        # 2-1. ํ•ด๋‹น ์›์†Œ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค์˜ ์ง„์ž…์ฐจ์ˆ˜์—์„œ 1์„ ๋บ€๋‹ค.
        for j in graph[now]:
            indegree[j] -= 1
            # 2-2. ์ƒˆ๋กญ๊ฒŒ ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ด ๋˜๋Š” ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…
            if indegree[j] == 0:
                heapq.heappush(que, j)
    # ์œ„์ƒ์ •๋ ฌ ์ˆ˜ํ–‰ํ•œ ์ •๋‹ต ์ถœ๋ ฅ
    for r in res:
        print(r, end=' ')


topology_sort()

๋А๋‚€์ 

์œ„์ƒ์ •๋ ฌ์ด๋ž€๊ฒƒ๋„ ์žˆ๊ตฌ๋‚˜.

์ฒ˜์Œ์— ๋จผ์ € ํ’€์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ž๋ฃŒ๊ตฌ์กฐํ™”๋ฅผ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ๋ง‰๋ง‰ํ–ˆ๋Š”๋ฐ, ๊ทธ๋ž˜ํ”„โ†’์œ„์ƒ์ •๋ ฌโ†’์šฐ์„ ์ˆœ์œ„ ํ๊นŒ์ง€ ๋„๋‹ฌํ•˜๋Š” ์‚ฌ๊ณ ๋‹จ๊ณ„๊ฐ€ ์ฒด๊ณ„์ ์ด๋ผ์„œ ํ’€๊ธฐ์— ์ข‹์•˜๋‹ค(?)

  • ์ฐธ๊ณ ํ•œ ๊ธ€
    ์œ„์ƒ ์ •๋ ฌ ํฌ์ŠคํŒ… ์„ค๋ช… ๊ตฟ

[[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์œ„์ƒ ์ •๋ ฌ (Topological Sorting)](https://velog.io/@kimdukbae/์œ„์ƒ-์ •๋ ฌ-Topological-Sorting)

๋ฌธ์ œ ๋ณด๊ณ  ๊ณ ๋ฏผ ํ›„ ์ฐพ์•„๋ณธ ํฌ์ŠคํŒ… ํ’€์ด ๊ตฟ

[[๋ฐฑ์ค€] 1766๋ฒˆ ๋ฌธ์ œ์ง‘(feat. ์œ„์ƒ ์ •๋ ฌ, heapq)](https://mgyo.tistory.com/807)

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentation

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions