πŸ“š Study/Baekjoon

[Silver II] 2644 - μ΄Œμˆ˜κ³„μ‚°

윰갱 2025. 4. 12. 16:02

문제

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

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

μž…λ ₯

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

각 μ‚¬λžŒμ˜ λΆ€λͺ¨λŠ” μ΅œλŒ€ ν•œ λͺ…λ§Œ μ£Όμ–΄μ§„λ‹€.

좜λ ₯

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

예제 μž…λ ₯ 1 λ³΅μ‚¬

9
7 3
7
1 2
1 3
2 7
2 8
2 9
4 5
4 6

예제 좜λ ₯ 1 λ³΅μ‚¬

3

예제 μž…λ ₯ 2 λ³΅μ‚¬

9
8 6
7
1 2
1 3
2 7
2 8
2 9
4 5
4 6

예제 좜λ ₯ 2 λ³΅μ‚¬

-1

# 풀이 방법

depthλ₯Ό κ΅¬ν•˜λŠ” 문제이기 λ•Œλ¬Έμ— bfsκ°€ μ μ ˆν•œ λ¬Έμ œμ˜€λ‹€.

촌수λ₯Ό μ–΄λ–»κ²Œ μ €μž₯ν•΄μ•Ό ν•˜λŠ”μ§€ 고민이 λ§Žμ•˜λŠ”λ° queueλ₯Ό μ €μž₯ν•  λ•Œ, ν˜„μž¬ λ…Έλ“œλΏ μ•„λ‹ˆλΌ depth도 ν•¨κ»˜ μ €μž₯ν•˜λŠ” 방법을 λ¦¬λ§ˆμΈλ“œν–ˆλ‹€.


# μ½”λ“œ

#  2025-04-12 15:26~56
import sys
from collections import deque

# sys.stdin = open("input.txt", "r")
n = int(sys.stdin.readline().strip())
p1, p2 = map(int, sys.stdin.readline().split())
m = int(sys.stdin.readline().strip())
graph = [list(map(int,sys.stdin.readline().split())) for _ in range(m)]
visited = [False] * (n+1)


def bfs(graph, start, visited):
    queue = deque()
    queue.append((start,0))
    visited[start] = True
    
    while queue:
        v, depth = queue.popleft()
        if v == p2:
            return depth
        for g in graph:
            if g[0] == v:
                if not visited[g[1]]:
                    visited[g[1]] = True
                    queue.append((g[1], depth + 1))
            elif g[1] == v:
                if not visited[g[0]]:
                    visited[g[0]] = True
                    queue.append((g[0], depth + 1))
    return -1
print(bfs(graph,p1,visited))