λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ“š Algorithm/Baekjoon

[Baekjoon] λ°±μ€€ 2644 '촌수 계산' λ¬Έμ œν’€μ΄ Python, 파이썬, μ•Œκ³ λ¦¬μ¦˜ 정리

 
πŸ“ 2644 문제 

우리 λ‚˜λΌλŠ” κ°€μ‘± ν˜Ήμ€ μΉœμ²™λ“€ μ‚¬μ΄μ˜ 관계λ₯Ό μ΄Œμˆ˜λΌλŠ” λ‹¨μœ„λ‘œ ν‘œν˜„ν•˜λŠ” λ…νŠΉν•œ λ¬Έν™”λ₯Ό 가지고 μžˆλ‹€. μ΄λŸ¬ν•œ μ΄Œμˆ˜λŠ” λ‹€μŒκ³Ό 같은 λ°©μ‹μœΌλ‘œ κ³„μ‚°λœλ‹€. 기본적으둜 λΆ€λͺ¨μ™€ μžμ‹ 사이λ₯Ό 1촌으둜 μ •μ˜ν•˜κ³  μ΄λ‘œλΆ€ν„° μ‚¬λžŒλ“€ κ°„μ˜ 촌수λ₯Ό κ³„μ‚°ν•œλ‹€. 예λ₯Ό λ“€λ©΄ λ‚˜μ™€ 아버지, 아버지와 ν• μ•„λ²„μ§€λŠ” 각각 1촌으둜 λ‚˜μ™€ ν• μ•„λ²„μ§€λŠ” 2촌이 되고, 아버지 ν˜•μ œλ“€κ³Ό ν• μ•„λ²„μ§€λŠ” 1촌, λ‚˜μ™€ 아버지 ν˜•μ œλ“€κ³ΌλŠ” 3촌이 λœλ‹€.

μ—¬λŸ¬ μ‚¬λžŒλ“€μ— λŒ€ν•œ λΆ€λͺ¨ μžμ‹λ“€ κ°„μ˜ 관계가 μ£Όμ–΄μ‘Œμ„ λ•Œ, 주어진 두 μ‚¬λžŒμ˜ 촌수λ₯Ό κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

 

μž…λ ₯ 

μ‚¬λžŒλ“€μ€ 1, 2, 3, …, n (1 ≤ n ≤ 100)의 μ—°μ†λœ 번호둜 각각 ν‘œμ‹œλœλ‹€. μž…λ ₯ 파일의 첫째 μ€„μ—λŠ” 전체 μ‚¬λžŒμ˜ 수 n이 주어지고, λ‘˜μ§Έ μ€„μ—λŠ” 촌수λ₯Ό 계산해야 ν•˜λŠ” μ„œλ‘œ λ‹€λ₯Έ 두 μ‚¬λžŒμ˜ λ²ˆν˜Έκ°€ 주어진닀. 그리고 μ…‹μ§Έ μ€„μ—λŠ” λΆ€λͺ¨ μžμ‹λ“€ κ°„μ˜ κ΄€κ³„μ˜ 개수 m이 주어진닀. λ„·μ§Έ μ€„λΆ€ν„°λŠ” λΆ€λͺ¨ μžμ‹κ°„μ˜ 관계λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 두 번호 x,yκ°€ 각 쀄에 λ‚˜μ˜¨λ‹€. μ΄λ•Œ μ•žμ— λ‚˜μ˜€λŠ” 번호 xλŠ” 뒀에 λ‚˜μ˜€λŠ” μ •μˆ˜ y의 λΆ€λͺ¨ 번호λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

각 μ‚¬λžŒμ˜ λΆ€λͺ¨λŠ” μ΅œλŒ€ ν•œ λͺ…λ§Œ 주어진닀.

 

좜λ ₯

μž…λ ₯μ—μ„œ μš”κ΅¬ν•œ 두 μ‚¬λžŒμ˜ 촌수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜λ₯Ό 좜λ ₯ν•œλ‹€. μ–΄λ–€ κ²½μš°μ—λŠ” 두 μ‚¬λžŒμ˜ μΉœμ²™ 관계가 μ „ν˜€ μ—†μ–΄ 촌수λ₯Ό 계산할 수 없을 λ•Œκ°€ μžˆλ‹€. μ΄λ•Œμ—λŠ” -1을 좜λ ₯ν•΄μ•Ό ν•œλ‹€.

 

🧐 풀이

μœ„μ˜ λ¬Έμ œλŠ” κ·Έλž˜ν”„ λ¬Έμ œμ΄λ‹€.

N은 μ‚¬λžŒ 수λ₯Ό μž…λ ₯ λ°›κ³ , μ„œλ‘œ λ‹€λ₯Έ 두 μ‚¬λžŒμ˜ 번호 A, Bλ₯Ό μž…λ ₯ λ°›λŠ”λ‹€. λΆ€λͺ¨-μžμ‹λ“€ μ‚¬μ΄μ˜ 관계 개수 Mκ³Ό M개의 쀄에 걸쳐 x, yλ₯Ό μž…λ ₯ λ°›λŠ”λ‹€. 이 λ•Œ xλŠ” y의 λΆ€λͺ¨μ΄λ‹€. 

μš°λ¦¬κ°€ ꡬ해야 ν•  것은 A와 B의 촌수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜μ΄λ‹€. 

κ°€μ€‘μΉ˜κ°€ λͺ¨λ‘ 1인 κ·Έλž˜ν”„μ΄λ‹€. (사싀 탐색 횟수둜 계산해도 λœλ‹€.) λ‚˜λŠ” DFS(μž¬κ·€)λ₯Ό μ‚¬μš©ν–ˆλ‹€. 

 

1. μž…λ ₯으둜 κ·Έλž˜ν”„ λ§Œλ“€κΈ° (리슀트)

2. νƒμƒ‰ν•˜κΈ° (v와 Bκ°€ κ°™μœΌλ©΄ res에 ν˜„μž¬ num 더해쀀닀) 

3. res에 아무것도 μ—†μœΌλ©΄(길이가 0이라면) -1을 λ°˜ν™˜ν•œλ‹€. 

 

N = int(input())
A, B = map(int, input().split())
M = int(input())
graph = [[] for _ in range(N+1)]
res = []
for _ in range(M) :
    x, y = map(int, input().split())
    graph[x].append(y)
    graph[y].append(x)

visited = [False] * (N+1)
def dfs(v, num) :
    num += 1
    visited[v] = True
    if v == B :
        res.append(num)
    for i in graph[v] :
        if not visited[i] : 
            dfs(i, num)
            
dfs(A,0)
if len(res) == 0 : 
    print(-1)
else :
    print(res[-1]-1)

 

 

 

728x90