알고리즘/백준

[파이썬] BOJ_2644(촌수계산)

딱따구르리 2023. 5. 30. 17:26
728x90
반응형

 

 

문제

 

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

 

2644번: 촌수계산

사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어

www.acmicpc.net


 

해설

 

입력값을 받고 그래프를 생성하는 부분을 지나면 dfs 혹은 bfs로 문제를 풀어야 한다.

dfs로 풀 때는 촌수를 cnt에 저장했다. 함수 한 번 씩 돌 때 마다 촌수가 1씩 올라간다.

 

 

반응형

 

bfs로 풀 때는 deque를 이용하면 된다. 따로 촌수를 받을 필요는 없고

visited 변수에 현재 visited 값에 1촌을 더해서 저장해주면 된다.

처음 a를 1로 시작하는데 a 자신은 0촌 이기 때문에 마지막에 출력할 때 1을 빼주면

원하는 촌수를 구할 수 있다.

a의 visited값에 1을 넣어주고 시작하지 않으면 for문을 돌 때 a를 다시 만나면 visited[a]가 0이라 

잘못된 촌수가 들어갈 수 있기 때문에 마지막에 1을 빼주게 되더라도 visited[a]에 1을 넣고 시작해야 한다.


코드

 

-파이썬

#백준 2644(촌수계산)
from collections import deque

n = int(input())  #전체 사람 수
a, b = map(int, input().split())  #촌수 계산할 사람 둘
m = int(input())  #부모-자식 관계 개수
graph = [[] for _ in range(n+1)]  #그래프 초기화
visited = [0] * (n+1)  #방문 여부

for i in range(m):  #그래프 생성
    x, y = map(int, input().split())  #부모, 자식
    graph[x] += [y]
    graph[y] += [x]

#DFS로 푸는 방법
def dfs(v, cnt):
    if v == b:  #찾아야 할 사람일 때
        print(cnt)
        exit()
    visited[v] = 1
    cnt += 1  #촌수
    for next in graph[v]:
        if visited[next] == 0:
            dfs(next, cnt)

dfs(a, 0)
print(-1)

# ------------------------------------------------

#BFS로 푸는 방법
def bfs(v):
    Q = deque([v])
    visited[v] = 1
    while Q:
        current = Q.popleft() 
        if current == b:  #찾아야 할 사람
            print(visited[current] - 1)
            break
        for next in graph[current]:
            if visited[next] == 0:
                visited[next] = visited[current] + 1
                Q.append(next)

bfs(a)
if visited[b] == 0:
    print(-1)

 

 

728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[파이썬] BOJ_2810(컵홀더)  (0) 2023.06.09
[파이썬] BOJ_2798(블랙잭)  (0) 2023.06.01
[파이썬] BOJ_2309(일곱 난쟁이)  (0) 2023.05.27
[파이썬] BOJ_2231(분해합)  (0) 2023.05.23
[파이썬] BOJ_8958(OX퀴즈)  (0) 2023.05.21