๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Coding Test/Algorithms

[๋ฐฑ์ค€] 24480. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… - ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ 2/Python - Silver 2

by The Future Engineer, Lucy 2025. 2. 4.
728x90
๋ฐ˜์‘ํ˜•

โ“๋ฌธ์ œ

https://www.acmicpc.net/problem/24480

์„ฑ๋Šฅ ์š”์•ฝ

๋ฉ”๋ชจ๋ฆฌ: 70312 KB, ์‹œ๊ฐ„: 540 ms

๋ถ„๋ฅ˜

๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰, ๊ทธ๋ž˜ํ”„ ์ด๋ก , ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰, ์ •๋ ฌ

๋ฌธ์ œ ์„ค๋ช…

์˜ค๋Š˜๋„ ์„œ์ค€์ด๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(DFS) ์ˆ˜์—… ์กฐ๊ต๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. ์•„๋น ๊ฐ€ ์ˆ˜์—…ํ•œ ๋‚ด์šฉ์„ ํ•™์ƒ๋“ค์ด ์ž˜ ์ดํ•ดํ–ˆ๋Š”์ง€ ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด์„œ ํ™•์ธํ•ด๋ณด์ž.

N๊ฐœ์˜ ์ •์ ๊ณผ M๊ฐœ์˜ ๊ฐ„์„ ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„(undirected graph)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ •์  ๋ฒˆํ˜ธ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ์ด๊ณ  ๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๋Š” 1์ด๋‹ค. ์ •์  R์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์œผ๋กœ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•  ๊ฒฝ์šฐ ๋…ธ๋“œ์˜ ๋ฐฉ๋ฌธ ์ˆœ์„œ๋ฅผ ์ถœ๋ ฅํ•˜์ž.

๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰ ์˜์‚ฌ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์ธ์ ‘ ์ •์ ์€ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๋ฐฉ๋ฌธํ•œ๋‹ค.

dfs(V, E, R) {  # V : ์ •์  ์ง‘ํ•ฉ, E : ๊ฐ„์„  ์ง‘ํ•ฉ, R : ์‹œ์ž‘ ์ •์ 
    visited[R] <- YES;  # ์‹œ์ž‘ ์ •์  R์„ ๋ฐฉ๋ฌธ ํ–ˆ๋‹ค๊ณ  ํ‘œ์‹œํ•œ๋‹ค.
    for each x ∈ E(R)  # E(R) : ์ •์  R์˜ ์ธ์ ‘ ์ •์  ์ง‘ํ•ฉ.(์ •์  ๋ฒˆํ˜ธ๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๋ฐฉ๋ฌธํ•œ๋‹ค)
        if (visited[x] = NO) then dfs(V, E, x);
}

โœ๐Ÿปํ’€์ด

๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๋ผ๊ณ  ํ•˜์˜€์œผ๋ฏ€๋กœ U์™€ V์˜ ์ธ์ ‘๋ฆฌ์ŠคํŠธ์— ๊ฐ ์ •์ ์„ ๋„ฃ๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๋ฐฉ๋ฌธํ•œ๋‹ค๊ณ  ํ•˜์˜€์œผ๋ฏ€๋กœ ๊ฐ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.

๊ฐ ์ •์ ์ด ๋ช‡ ๋ฒˆ์งธ๋กœ ๋ฐฉ๋ฌธํ•œ ์ •์ ์ธ์ง€ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ cnt๋ฅผ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋ฉฐ visited์— ์ €์žฅํ•œ๋‹ค. ๋ชจ๋“  ์ •์ ์˜ ๋ฐฉ๋ฌธ์„ ๋งˆ์น˜๊ณ  ๋ฐฉ๋ฌธํ•œ ์ •์ ์€ visited์— ์ €์žฅ๋œ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ณ , ์‹œ์ž‘ ์ •์ ์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ๋ชปํ•œ ๊ณณ์ด๋ผ๋ฉด 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ’ป์ฝ”๋“œ

import sys

input = sys.stdin.readline
sys.setrecursionlimit(10**6) # recursion limit ๋Š˜๋ฆฌ๊ธฐ

N, M, R = map(int, input().split())
graph = [[] for _ in range(N+1)]
for _ in range(M):
    U, V = map(int, input().split())
    graph[U].append(V)
    graph[V].append(U)

for i in range(1, N+1):
    graph[i].sort(reverse=True)

visited = [False] * (N+1)
cnt = 1
def dfs(u):
    global cnt
    visited[u] = cnt
    cnt += 1
    for v in graph[u]:
        if not visited[v]:
            dfs(v)

dfs(R)
for i in range(1, N+1):
    if not visited[i]:
        print(0)
    else:
        print(visited[i])

๐Ÿ“ํ›„๊ธฐ

PyPy3๋กœ ํ•˜๋ฉด ๋ณดํ†ต ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋งŽ์ด ์žกํžˆ๋˜๋ฐ ๊ทธ๋ž˜์„œ ๊ทธ๋Ÿฐ์ง€ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋‚˜์˜ค๊ณ  Python3๋กœ ํ•˜๋‹ˆ๊นŒ ๋งž์•˜๋‹ค๊ณ  ํ•œ๋‹ค...

PyPy3๋กœ ์“ฐ๋Š” ๊ณณ ์€๊ทผ ์žˆ๋˜๋ฐ ๋ฉ”๋ชจ๋ฆฌ๋„ ์—ด์‹ฌํžˆ ๊ณ„์‚ฐํ•ด์•ผ ํ•  ๋“ฏ..๐Ÿฅฒ

๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ ์ž์ฒด๊ฐ€ recursion์„ ์จ์•ผํ•˜๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ recursion error๋‚˜๋Š” ๊ฒƒ๋„ ์–ด์ด๊ฐ€ ์ข€ ์—†๋‹ค..

728x90
๋ฐ˜์‘ํ˜•