[Python] 16947 ์„œ์šธ ์ง€ํ•˜์ฒ  2ํ˜ธ์„ 

2026. 3. 19. 13:55ยทCoding-Test/๋ฐฑ์ค€
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ป ๋ฌธ์ œ ์ •์˜

๋‹ค์Œ ์ง€ํ•˜์ฒ  2ํ˜ธ์„ ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ฐ ๊ตฌ๊ฐ„๊ณผ ์ˆœํ™˜ ๊ตฌ๊ฐ„ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

 

๐Ÿ’ก ์ ‘๊ทผ ๋ฐ ์„ค๊ณ„

๊ทธ๋ž˜ํ”„์—์„œ ์‚ฌ์ดํด์ด ๋ฐœ์ƒํ•˜๋Š” ๊ตฌ๊ฐ„์„ ๊ตฌํ•˜๊ณ  ํ•ด๋‹น ๊ตฌ๊ฐ„์— ํฌํ•จ๋œ ๋…ธ๋“œ๋“ค์˜ ๊ฑฐ๋ฆฌ๋Š” 0์ด ๋œ๋‹ค. ์ดํ›„ ์‚ฌ์ดํด์ด ์•„๋‹Œ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ์‚ฌ์ดํด์ด ํฌํ•จ๋œ ๋…ธ๋“œ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.

๋ฌธ์ œ์—์„œ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ N๊ฐœ, ๊ทธ๋ฆฌ๊ณ  ๊ฐ„์„ ์˜ ์ˆ˜๋„ N๊ฐœ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ๊ทธ๋ž˜ํ”„์—๋Š” ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ ์‚ฌ์ดํด์ด ์กด์žฌํ•œ๋‹ค. DFS๋กœ ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ์™€ ํ˜„์žฌ ๋ฐฉ๋ฌธ ๋…ธ๋“œ๋ฅผ ๋น„๊ตํ•˜๋ฉฐ ๊ฐ™๋‹ค๋ฉด, ์‚ฌ์ดํด์ด ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ดํ›„ ์‚ฌ์ดํด์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ BFS๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์„๊ฒƒ์ด๋‹ค.

โœ๏ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด

cycle = [False] * (N+1)

def dfs(node, start, cnt):
    # ํ˜„์žฌ ๋ฐฉ๋ฌธ ์ ๊ณผ ์‹œ์ž‘์ ์ด ๊ฐ™๊ณ , ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ ์ˆ˜๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๋ฉด
    if node == start and cnt >= 2:
        cycle[node] = True
        return

    visited[node] = True

    for ix in graph[node]:
        if not visited[ix]:
            dfs(ix, start, cnt+1)
        elif ix == start and cnt >= 2:
            dfs(ix, start, cnt)
            
for i in range(1, N+1):
    visited = [False] * (N+1)
    dfs(i, i, 0)

๋ฐฉ๋ฌธ ๋…ธ๋“œ์™€ ํƒ์ƒ‰ ์‹œ์ž‘๋…ธ๋“œ, ๊ทธ๋ฆฌ๊ณ  ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ ์ •๋ณด๋ฅผ ํ†ตํ•ด ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•œ๋‹ค. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋กœ ํƒ์ƒ‰์„ ์ด์–ด๋‚˜๊ฐˆ๋• ๋ฐฉ๋ฌธ ๋…ธ๋“œ ๊ฐœ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ์ฃผ๊ณ , ๋‹ค์Œ ๋ฐฉ๋ฌธ ์˜ˆ์ •์ธ ๋…ธ๋“œ๊ฐ€ ์‹œ์ž‘์ ๊ณผ ์ผ์น˜ํ•˜๋‹ค๋ฉด ์ง€๊ธˆ ์ •๋ณด ๊ทธ๋Œ€๋กœ ํƒ์ƒ‰์„ ์ด์–ด๋‚˜๊ฐ„๋‹ค. ์ตœ์ข…์ ์œผ๋กœ ํ˜„์žฌ ๋ฐฉ๋ฌธ ๋…ธ๋“œ์™€ ์‹œ์ž‘ ๋…ธ๋“œ๊ฐ€ ๊ฐ™๊ณ , ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๋ผ๋ฉด ํ•ด๋‹น ๋…ธ๋“œ๋Š” ์‚ฌ์ดํด์ด ๋ฐœ์ƒํ•œ๋‹ค.

def bfs():
    Q = deque()
    for i in range(1, N+1):
        if cycle[i]:
            Q.append(i)
            visited[i] = 0

    while Q:
        curr = Q.popleft()

        for ix in graph[curr]:
            if visited[ix] == -1:
                visited[ix] = visited[curr]+1
                Q.append(ix)
                
visited = [-1] * (N+1)
bfs()

์ดํ›„ ์‚ฌ์ดํด์ด ์กด์žฌํ•˜๋Š” ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ์‚ฌ์ดํด์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋…ธ๋“œ๋กœ BFS๋ฅผ ์ด์–ด๊ฐ€๋ฉฐ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ๋‹ค. ์ตœ์ข…์ ์œผ๋กœ visited๋ฆฌ์ŠคํŠธ์— ๊ฑฐ๋ฆฌ ์ •๋ณด๊ฐ€ ์ €์žฅ๋  ๊ฒƒ์ด๋‹ค.

๐Ÿ—’๏ธ ์ตœ์ข… ์ œ์ถœ ์ฝ”๋“œ

# 16947 ์„œ์šธ ์ง€ํ•˜์ฒ  2ํ˜ธ์„ 

import sys
from collections import deque
sys.setrecursionlimit(10 ** 6)

def dfs(node, start, cnt):
    # ํ˜„์žฌ ๋ฐฉ๋ฌธ ์ ๊ณผ ์‹œ์ž‘์ ์ด ๊ฐ™๊ณ , ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ ์ˆ˜๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๋ฉด
    if node == start and cnt >= 2:
        cycle[node] = True
        return

    visited[node] = True

    for ix in graph[node]:
        if not visited[ix]:
            dfs(ix, start, cnt+1)
        elif ix == start and cnt >= 2:
            dfs(ix, start, cnt)

def bfs():
    Q = deque()
    for i in range(1, N+1):
        if cycle[i]:
            Q.append(i)
            visited[i] = 0

    while Q:
        curr = Q.popleft()

        for ix in graph[curr]:
            if visited[ix] == -1:
                visited[ix] = visited[curr]+1
                Q.append(ix)
            
N = int(input())
graph = [[] for _ in range(N+1)]
for _ in range(N):
    a, b = map(int, input().split())
    graph[a].append(b)
    graph[b].append(a)

cycle = [False] * (N+1)

for i in range(1, N+1):
    visited = [False] * (N+1)
    dfs(i, i, 0)

visited = [-1] * (N+1)
bfs()

for i in range(1, N+1):
    print(visited[i], end=' ')

โ“ ๋˜ ๋‹ค๋ฅธ ํ’€์ด

์‚ฌ์ดํด์ด ๋ฐœ์ƒํ•˜๋Š” ๊ตฌ๊ฐ„์„ ์ฐพ๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ๊ฐ ๋…ธ๋“œ์˜ ์ฐจ์ˆ˜๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.

  1. ๊ฐ ๋…ธ๋“œ์˜ ์ฐจ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค. ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ์ฐจ์ˆ˜๋Š” 1์ด๋‹ค.
  2. ์ฐจ์ˆ˜๊ฐ€ 1์ธ ๋…ธ๋“œ์— ๋Œ€ํ•ด DFS๋ฅผ ์ด์–ด๋‚˜๊ฐ„๋‹ค. ๋ฆฌํ”„ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
  3. ๋ชจ๋“  ๋ฆฌํ”„๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•œ ํ›„์—๋„ ์ฐจ์ˆ˜๊ฐ€ 1๋ณด๋‹ค ํฐ ๋…ธ๋“œ๋“ค์€ ์‚ฌ์ดํด์ด ๋ฐœ์ƒํ•œ๋‹ค.

์ฐจ์ˆ˜(degree) : ํ•œ ๋…ธ๋“œ์— ์กด์žฌํ•˜๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜. ๋”ฐ๋ผ์„œ ์ฐจ์ˆ˜๊ฐ€ 1์ด๋ฉด ํ•ด๋‹น ๋…ธ๋“œ๋Š” ๊ฐ„์„ ์ด ํ•œ ๊ฐœ ์กด์žฌ. ๋”ฐ๋ผ์„œ leaf_node๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , ์ฐจ์ˆ˜๊ฐ€ 2 ์ด์ƒ์ด๋ผ๋ฉด leaf_node๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋ชจ๋“  leaf_node๋ฅผ ์ œ๊ฑฐํ•œ ํ›„์—๋„ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๋ผ๋ฉด, ํ•ด๋‹น ๋…ธ๋“œ๋Š” ์‚ฌ์ดํด์— ์กด์žฌํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

cycle = [True] * (N+1)
def find_cycle():
    Q = deque()
    for i in range(1, N+1):
        if degree[i] == 1:
            Q.append(i)

    while Q:
        curr = Q.popleft()
        cycle[curr] = False

        for next in graph[curr]:
            degree[next] -= 1
            if degree[next] == 1:
                Q.append(next)

์ฐจ์ˆ˜๋ฅผ ์ด์šฉํ•ด leaf_node๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๋‚จ์•„์žˆ๋Š” ๋…ธ๋“œ๋“ค์€ ์‚ฌ์ดํด์„ ๊ตฌ์„ฑํ•จ์„ ์ด์šฉํ•œ ํ’€์ด ๋ฐฉ๋ฒ•์ด๋‹ค.

๐Ÿ—’๏ธ ์ตœ์ข… ์ œ์ถœ ์ฝ”๋“œ (2)

# 16947 ์„œ์šธ ์ง€ํ•˜์ฒ  2ํ˜ธ์„ 

import sys
from collections import deque
sys.setrecursionlimit(10 ** 6)

def find_cycle():
    Q = deque()
    for i in range(1, N+1):
        if degree[i] == 1:
            Q.append(i)

    while Q:
        curr = Q.popleft()
        cycle[curr] = False

        for next in graph[curr]:
            degree[next] -= 1
            if degree[next] == 1:
                Q.append(next)

def bfs():
    Q = deque()
    for i in range(1, N+1):
        if cycle[i]:
            Q.append(i)
            visited[i] = 0

    while Q:
        curr = Q.popleft()

        for ix in graph[curr]:
            if visited[ix] == -1:
                visited[ix] = visited[curr]+1
                Q.append(ix)

N = int(input())
graph = [[] for _ in range(N+1)]
degree = [0] * (N+1)
for _ in range(N):
    a, b = map(int, input().split())
    graph[a].append(b)
    graph[b].append(a)
    degree[a] += 1
    degree[b] += 1

cycle = [True] * (N+1)
find_cycle()

visited = [-1] * (N+1)
bfs()

for v in visited[1:]:
    print(v, end=' ')

๐Ÿ’ญ ์˜ค๋Š˜์˜ ํšŒ๊ณ 

๊ทธ๋ž˜ํ”„์—์„œ ์‚ฌ์ดํด์„ ์ฐพ๋Š” ํ›„ ํƒ์ƒ‰์„ ํ†ตํ•ด ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•œ๋‹ค๋Š” ์ƒ๊ฐ์€ ํ–ˆ์œผ๋‚˜, ์‚ฌ์ดํด์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์„ ๋ชฐ๋ผ ๊ณ ์ „ํ–ˆ๋˜ ๋ฌธ์ œ์˜€๋‹ค.

Union-Find๋ฅผ ํ™œ์šฉํ•œ ๋ถ„๋ฆฌ ์ง‘ํ•ฉ์œผ๋กœ ์‚ฌ์ดํด์„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ์„๊ฑฐ๋ผ ์ƒ๊ฐํ•˜์˜€์œผ๋‚˜ Union-Find๋Š” ๋‹จ์ˆœ ์‚ฌ์ดํด ์กด์žฌ ์—ฌ๋ถ€๋งŒ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๊ณ , ์–ด๋–ค ๋…ธ๋“œ๋“ค์ด ์‚ฌ์ดํด์„ ๊ตฌ์„ฑํ•˜๋Š”์ง€๋Š” ์•Œ์•„๋‚ผ ์ˆ˜๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ Union-Find๋Š” ์ ํ•ฉํ•œ ํ’€์ด ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ์—ˆ๋‹ค.

DFS๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ฌ์ดํด์„ ์ฐพ์€๋‹ค์Œ BFS๋กœ ์‚ฌ์ดํด - ๋…ธ๋“œ๊ฐ„์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ์‹์ด ์ •์„ ํ’€์ด์ธ ์ค„ ์•Œ์•˜์œผ๋‚˜ ๊ฐ ๋…ธ๋“œ์˜ ์ฐจ์ˆ˜(degree)๋ฅผ ์ด์šฉํ•ด leaf_node๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ์‚ฌ์ดํด์„ ์ฐพ์•„๋‚ด๋Š” ๊ฒƒ์ด ์ •์„์ธ ๋ฌธ์ œ์˜€๋‹ค. ์‹œ๊ฐ„๋„ ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ๊ตฌํ˜„๋„ DFS๋ณด๋‹ค ์‰ฌ์šด ๊ฒƒ ๊ฐ™๋‹ค.

728x90
๋ฐ˜์‘ํ˜•
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'Coding-Test > ๋ฐฑ์ค€' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Python] 2342 Dance Dance Revolution  (0) 2026.03.20
[Python] 11049 ํ–‰๋ ฌ ๊ณฑ์…ˆ ์ˆœ์„œ  (0) 2026.03.20
[Python] 2613 ์ˆซ์ž๊ตฌ์Šฌ  (0) 2026.03.18
[Python] 16946 ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ 4  (0) 2026.03.17
[Python] 1765 ๋‹ญ์‹ธ์›€ ํŒ€ ์ •ํ•˜๊ธฐ  (0) 2026.03.03
'Coding-Test/๋ฐฑ์ค€' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Python] 2342 Dance Dance Revolution
  • [Python] 11049 ํ–‰๋ ฌ ๊ณฑ์…ˆ ์ˆœ์„œ
  • [Python] 2613 ์ˆซ์ž๊ตฌ์Šฌ
  • [Python] 16946 ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ 4
ํฌ์™„
ํฌ์™„
ํฌ์™„ํ•œ ์ฝ”๋”ฉ์ผ์ƒ
    ๋ฐ˜์‘ํ˜•
  • ํฌ์™„
    Code-Heewan
    ํฌ์™„
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
      • Python
        • ๊ฐ€์ƒํ™˜๊ฒฝ
      • Algorithm
      • Coding-Test
        • ๋ฐฑ์ค€
        • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
        • ํ•ญํ•ด99
      • Data-Analysis
      • ์›น ๊ฐœ๋ฐœ
        • django
      • AWS
      • ๊ณต๋ชจ์ „
      • Mobile
  • ๋งํฌ

    • Github
  • 300x250
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
ํฌ์™„
[Python] 16947 ์„œ์šธ ์ง€ํ•˜์ฒ  2ํ˜ธ์„ 
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”