백준 문제 링크: https://www.acmicpc.net/problem/16562
문제 요약
친구비를 주면 한 달간 친구가 생긴다!
'친구의 친구는 친구다'를 이용해 모든 사람과 친구가 되는 최소 비용 출력, 안 되면 Oh no 출력
핵심 아이디어
‘친구의 친구는 친구’이기에 트리 계층 관계를 떠올릴 수 있고, ‘모든 사람과 친구’가 되어야 하기에 모든 노드를 연결한다고 생각하면 된다. union & find를 통해 친구 관계를 합쳐주는데, 비용 적은 애를 부모 노드로 해서 합쳐주고, 그 비용을 더하면 된다.
풀이
# gold4-16562. 친구비
import sys
input = sys.stdin.readline
n, m, k = map(int, input().split()) # 학생 수, 친구관계 수, 가지고 있는 돈
friend_cost = [0] + list(map(int, input().split()))
parent = [i for i in range(n + 1)]
def find_parent(x):
if parent[x] != x:
parent[x] = find_parent(parent[x])
return parent[x]
def union_parent(a, b): # 비용 적은 기준으로 합쳐줌
a = find_parent(a)
b = find_parent(b)
if friend_cost[a] < friend_cost[b]:
parent[b] = a
friend_cost[b] = 0 # 비용 더 적은 애가 부모가 됐으니까 b의 비용은 더할 필요 없어짐 -> 0으로.
else:
parent[a] = b
friend_cost[a] = 0
for _ in range(m):
v, w = map(int, input().split())
union_parent(v, w) # 친구 관계에 있으니까 합쳐줌
total_cost = sum(friend_cost)
if total_cost <= k:
print(total_cost)
else: # 친구 사귀는 데 드는 총 비용이 예산보다 크다면 모두와 친구가 될 수 없음
print("Oh no")
실행 시간
메모리 32276KB, 시간 56ms (python3)
'ALGORITHM > 백준' 카테고리의 다른 글
[BOJ/PYTHON] 2003. 수들의 합 2 (0) | 2023.05.25 |
---|---|
[BOJ/PYTHON] 13904. 과제 (0) | 2023.05.24 |
[BOJ/PYTHON] 10423. 전기가 부족해 (0) | 2023.05.24 |
[BOJ/PYTHON] 6497. 전력난 (0) | 2023.05.24 |
[BOJ/PYTHON] 4803. 트리 (0) | 2023.05.24 |
댓글