2644번: 촌수계산
사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어
www.acmicpc.net
문제
우리 나라는 가족 혹은 친척들 사이의 관계를 촌수라는 단위로 표현하는 독특한 문화를 가지고 있다. 이러한 촌수는 다음과 같은 방식으로 계산된다. 기본적으로 부모와 자식 사이를 1촌으로 정의하고 이로부터 사람들 간의 촌수를 계산한다. 예를 들면 나와 아버지, 아버지와 할아버지는 각각 1촌으로 나와 할아버지는 2촌이 되고, 아버지 형제들과 할아버지는 1촌, 나와 아버지 형제들과는 3촌이 된다.
여러 사람들에 대한 부모 자식들 간의 관계가 주어졌을 때, 주어진 두 사람의 촌수를 계산하는 프로그램을 작성하시오.
입력
사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어진다. 그리고 셋째 줄에는 부모 자식들 간의 관계의 개수 m이 주어진다. 넷째 줄부터는 부모 자식간의 관계를 나타내는 두 번호 x,y가 각 줄에 나온다. 이때 앞에 나오는 번호 x는 뒤에 나오는 정수 y의 부모 번호를 나타낸다.
각 사람의 부모는 최대 한 명만 주어진다.
출력
입력에서 요구한 두 사람의 촌수를 나타내는 정수를 출력한다. 어떤 경우에는 두 사람의 친척 관계가 전혀 없어 촌수를 계산할 수 없을 때가 있다. 이때에는 -1을 출력해야 한다.
코드
from collections import deque
def bfs(a, b, ad_list, visited):
# 현재 노드 방문 처리 & 큐에 넣기
visited[a] = 1
que = deque([a])
while que:
v = que.popleft()
# 촌수 찾음
if v == b:
return
for i in ad_list[v]:
if visited[i] != 0: # 이미 방문한 노드
continue
que.append(i)
visited[i] = visited[v] + 1
n = int(input()) # 사람 수
a, b = map(int, input().split()) # 촌수 계산해야하는 두 사람
m = int(input()) # 부모 자식 관계 개수(부모는 최대 한 명만 주어짐)
adjency_list = [[] for i in range(n + 1)]
visited = [0 for _ in range(n + 1)]
for i in range(m):
x, y = map(int, input().split())
adjency_list[x].append(y)
adjency_list[y].append(x)
bfs(a,b,adjency_list, visited)
print(visited[b] - 1)
처음에는 union-find를 생각했으나 그 방식으로는 두 사람이 친척 관계를 갖는지만 알 수 있을 것 같아 bfs를 활용하여 풀었다. visited를 모두 0으로 초기화해놓고 탐색을 하며 출발노드에서부터의 거리를 여기에 저장한다. 코드 상 출발 노드부터 1이 저장되므로 최종 답을 출력할 때는 1을 빼서 출력한다. 이렇게 하면 두 노드의 친척 관계가 없는 경우 visited의 값이 0이므로 관계가 없는 경우 -1을 출력할 수 있다.
'문제풀이 > DFS_BFS' 카테고리의 다른 글
[Python] 백준 12852번 1로 만들기 2 (0) | 2022.08.03 |
---|---|
[Python] 백준 4963번 섬의 개수 (0) | 2022.01.22 |
[Python/파이썬] 백준 1012번 유기농 배추 (0) | 2022.01.17 |
[Python/파이썬] 백준 2606번 바이러스 (0) | 2022.01.14 |
[Python/파이썬] 백준 2178번 미로 탐색 (0) | 2022.01.14 |
2644번: 촌수계산
사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어
www.acmicpc.net
문제
우리 나라는 가족 혹은 친척들 사이의 관계를 촌수라는 단위로 표현하는 독특한 문화를 가지고 있다. 이러한 촌수는 다음과 같은 방식으로 계산된다. 기본적으로 부모와 자식 사이를 1촌으로 정의하고 이로부터 사람들 간의 촌수를 계산한다. 예를 들면 나와 아버지, 아버지와 할아버지는 각각 1촌으로 나와 할아버지는 2촌이 되고, 아버지 형제들과 할아버지는 1촌, 나와 아버지 형제들과는 3촌이 된다.
여러 사람들에 대한 부모 자식들 간의 관계가 주어졌을 때, 주어진 두 사람의 촌수를 계산하는 프로그램을 작성하시오.
입력
사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어진다. 그리고 셋째 줄에는 부모 자식들 간의 관계의 개수 m이 주어진다. 넷째 줄부터는 부모 자식간의 관계를 나타내는 두 번호 x,y가 각 줄에 나온다. 이때 앞에 나오는 번호 x는 뒤에 나오는 정수 y의 부모 번호를 나타낸다.
각 사람의 부모는 최대 한 명만 주어진다.
출력
입력에서 요구한 두 사람의 촌수를 나타내는 정수를 출력한다. 어떤 경우에는 두 사람의 친척 관계가 전혀 없어 촌수를 계산할 수 없을 때가 있다. 이때에는 -1을 출력해야 한다.
코드
from collections import deque def bfs(a, b, ad_list, visited): # 현재 노드 방문 처리 & 큐에 넣기 visited[a] = 1 que = deque([a]) while que: v = que.popleft() # 촌수 찾음 if v == b: return for i in ad_list[v]: if visited[i] != 0: # 이미 방문한 노드 continue que.append(i) visited[i] = visited[v] + 1 n = int(input()) # 사람 수 a, b = map(int, input().split()) # 촌수 계산해야하는 두 사람 m = int(input()) # 부모 자식 관계 개수(부모는 최대 한 명만 주어짐) adjency_list = [[] for i in range(n + 1)] visited = [0 for _ in range(n + 1)] for i in range(m): x, y = map(int, input().split()) adjency_list[x].append(y) adjency_list[y].append(x) bfs(a,b,adjency_list, visited) print(visited[b] - 1)
처음에는 union-find를 생각했으나 그 방식으로는 두 사람이 친척 관계를 갖는지만 알 수 있을 것 같아 bfs를 활용하여 풀었다. visited를 모두 0으로 초기화해놓고 탐색을 하며 출발노드에서부터의 거리를 여기에 저장한다. 코드 상 출발 노드부터 1이 저장되므로 최종 답을 출력할 때는 1을 빼서 출력한다. 이렇게 하면 두 노드의 친척 관계가 없는 경우 visited의 값이 0이므로 관계가 없는 경우 -1을 출력할 수 있다.
'문제풀이 > DFS_BFS' 카테고리의 다른 글
[Python] 백준 12852번 1로 만들기 2 (0) | 2022.08.03 |
---|---|
[Python] 백준 4963번 섬의 개수 (0) | 2022.01.22 |
[Python/파이썬] 백준 1012번 유기농 배추 (0) | 2022.01.17 |
[Python/파이썬] 백준 2606번 바이러스 (0) | 2022.01.14 |
[Python/파이썬] 백준 2178번 미로 탐색 (0) | 2022.01.14 |