μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

[μ΄μ½”ν…Œ Ch18-45] μ΅œμ’… μˆœμœ„ (κ·Έλž˜ν”„)

은진 2022. 5. 17. 20:18

πŸ‘©πŸ»β€πŸ’»λ¬Έμ œμ„€λͺ…

[μ΄μ½”ν…Œ Ch18-45] μ΅œμ’… μˆœμœ„ (κ·Έλž˜ν”„)
μ΄μ½”ν…Œ

✍️Idea Sketch

λ¬Έμ œμš”μ•½

νŒ€μ€ 1λ²ˆλΆ€ν„° nλ²ˆκΉŒμ§€ λ²ˆν˜Έκ°€ 맀겨져 μžˆλ‹€.
μž‘λ…„μ—λŠ” μ΅œμ’… μˆœμœ„λ₯Ό λ°œν‘œν–ˆλ‹€.
ν•˜μ§€λ§Œ μ˜¬ν•΄μ—λŠ” μž‘λ…„κ³Ό λΉ„κ΅ν•˜μ—¬ μƒλŒ€μ μΈ μˆœμœ„κ°€ 바뀐 νŒ€μ˜ λͺ©λ‘λ§Œ λ°œν‘œν–ˆλ‹€.

μ˜¬ν•΄ λͺ©λ‘μ„ λ°”νƒ•μœΌλ‘œ μ˜¬ν•΄ μ΅œμ’… μˆœμœ„λ₯Ό λ§Œλ“€μ–΄ 좜λ ₯ν•΄λ³΄μž.

"?"λ₯Ό 좜λ ₯ : ν™•μ‹€ν•œ μˆœμœ„λ₯Ό 찾을 수 μ—†λŠ” 경우
"IMPOSSIBLE"을 좜λ ₯ : 데이터에 일관성이 μ—†μ–΄μ„œ μˆœμœ„λ₯Ό μ •ν•  수 μ—†λŠ” 경우


μ•Œκ³ λ¦¬μ¦˜ : μœ„μƒ μ •λ ¬

μœ„μƒ 정렬은 사이클이 μ—†λŠ” λ°©ν–₯ κ·Έλž˜ν”„μ˜ λͺ¨λ“  λ…Έλ“œλ₯Ό λ°©ν–₯성에 거슀λ₯΄μ§€ μ•Šλ„λ‘ μˆœμ„œλŒ€λ‘œ λ‚˜μ—΄ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.

μž‘λ…„μ˜ μ΅œμ’… μˆœμœ„λŠ” λ°©ν–₯성을 가지고 μžˆλ‹€. 이λ₯Ό 인접 리슀트둜 ν‘œν˜„ν•œ ν›„, μ˜¬ν•΄μ˜ λͺ©λ‘μ— 따라 일뢀 κ°„μ„ μ˜ λ°©ν–₯을 λ°”κΎΌλ‹€. 인접 리슀트λ₯Ό λ‹€μ‹œ λ°©ν–₯성에 거슀λ₯΄μ§€ μ•Šλ„λ‘ μˆœμ„œλŒ€λ‘œ λ‚˜μ—΄ν•˜λ©΄ λœλ‹€.


μ‹œκ°„λ³΅μž‘λ„

O(V + E)

μœ„μƒ μ •λ ¬μ—μ„œλŠ” μ°¨λ‘€λŒ€λ‘œ λͺ¨λ“  λ…Έλ“œλ₯Ό ν™•μΈν•˜λ©° 각 λ…Έλ“œμ—μ„œ λ‚˜κ°€λŠ” 간선을 μ°¨λ‘€λŒ€λ‘œ μ œκ±°ν•œλ‹€. λͺ¨λ“  λ…Έλ“œμ™€ λͺ¨λ“  간선을 ν™•μΈν•˜λ―€λ‘œ μœ„μƒ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(V + E) 이닀.


βœοΈλ‚΄ μ†ŒμŠ€μ½”λ“œ

  • μž‘λ…„μ˜ μ΅œμ’… μˆœμœ„λ₯Ό μΈμ ‘λ¦¬μŠ€νŠΈλ‘œ κ΅¬ν˜„ν•œλ‹€.
    1 -> []
    2 -> [1]
    3 -> [2, 1]
    4 -> [3, 2, 1]
    5 -> [4, 3, 2, 1]

  • μ˜¬ν•΄ λͺ©λ‘μ„ λ°”νƒ•μœΌλ‘œ κ°„μ„ μ˜ λ°©ν–₯κ³Ό μ§„μž…μ°¨μˆ˜λ₯Ό μˆ˜μ •ν•œλ‹€.

  • μœ„μƒ 정렬을 κ΅¬ν˜„ν•œλ‹€.

  • cycle이 생긴 경우, 데이터에 일관성이 μ—†λŠ” κ²ƒμ΄λ―€λ‘œ "IMPOSSIBLE"을 좜λ ₯ν•œλ‹€. μ˜¬ν•΄ λͺ©λ‘μ— (1, 2), (2, 3)이 μžˆμ–΄ μˆœμœ„κ°€ λ’€μ§‘νžŒ 경우 μ•„λž˜μ™€ 같이 사이클이 생긴닀.
    1 -> [2]
    2 -> [3]
    3 -> [1]

  • ν™•μ‹€ν•œ μˆœμœ„λ₯Ό 찾을 수 μ—†λ‹€λŠ” 말은 곡동 μˆœμœ„κ°€ μžˆλ‹€λŠ” λœ»μ΄λ‹€. ν•˜μ§€λ§Œ μ˜¬ν•΄ λͺ©λ‘μ€ μƒλŒ€μ  μˆœμœ„κ°€ λ’€μ§‘νžŒ λͺ©λ‘μΌ 뿐이닀. 곡동 2μœ„, 곡동 3μœ„μ™€ 같은 μ •λ³΄λŠ” ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ μž‘λ…„ μ΅œμ’… μˆœμœ„μ— 곡동 μˆœμœ„κ°€ μžˆμ–΄μ•Ό μ˜¬ν•΄μ—λ„ ν™•μ‹€ν•œ μˆœμœ„λ₯Ό 찾을 수 μ—†λ‹€. μ• μ΄ˆμ— μž‘λ…„ μ΅œμ’… μˆœμœ„μ—λ„ 곡동 μˆœμœ„λŠ” κ³ λ €ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ, "?"λ₯Ό 좜λ ₯ν•˜λŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” μ—†λ‹€.


전체 μ½”λ“œ

  from collections import deque
  import sys
  si = sys.stdin.readline

  t = int(si())

  for _ in range(t):
      n = int(si())
      team = list(map(int, si().rstrip().split()))

      graph = [[] for _ in range(n + 1)]
      degree = [0 for _ in range(n + 1)]

      for i in range(n - 1):
          for j in range(i + 1, n):
              graph[team[i]].append(team[j])
              degree[team[j]] += 1

      # μ˜¬ν•΄ λͺ©λ‘
      m = int(si())
      for _ in range(m):
          a, b = map(int, si().rstrip().split())
          flag = True

          for x in graph[a]:
              if x == b:
                  graph[a].remove(b)
                  graph[b].append(a)
                  degree[b] -= 1
                  degree[a] += 1
                  flag = False

          if flag:  # aκ°€ graph[b]에 있음
              graph[b].remove(a)
              graph[a].append(b)
              degree[a] -= 1
              degree[b] += 1

      # μœ„μƒ μ •λ ¬
      queue = deque()
      answer = []

      for i in range(1, n + 1):
          if degree[i] == 0:
              queue.append(i)

      while queue:
          x = queue.popleft()
          answer.append(x)
          for y in graph[x]:
              degree[y] -= 1
              if degree[y] == 0:
                  queue.append(y)

      if len(answer) < n:
          print("IMPOSSIBLE")
      else:
          print(*answer)