[Python] 16562 친구비

2026. 1. 31. 21:53·Coding-Test/백준
728x90
반응형

[Gold IV] 친구비 - 16562 

[문제 링크](https://www.acmicpc.net/problem/16562)


💻 문제 정의

현재 가진 비용으로 친구들에게 친구비를 주면서 친구 관계를 맺는다고 할 때, 최소 비용으로 모든 친구와 친구할 수 있도록 구하여라.

💡 접근 및 설계

BFS 또는 DFS 그래프 탐색을 통해 친구 그룹을 생성한다. 각 그룹 중에 최소 비용으로 친구를 맺는다면 최소 비용으로 모든 친구와 친구를 맺을 수 있을거라 생각하였다.

✏️ 알고리즘 풀이

def bfs(n):
    Q = deque()
    Q.append(n)
    visited[n] = True

    lst = [n]
    while Q:
        c = Q.popleft()

        for ix in graph[c]:
            if not visited[ix]:
                visited[ix] = True
                Q.append(ix)
                lst.append(ix)

    return lst
    
res = []
for i in range(1, N+1):
    if not visited[i]:
        res.append(bfs(i))

BFS를 이용하여 친구 그룹을 구하였다. 친구 관계가 그래프로 주어질 것이고, 모든 노드에서 방문하지 않은 노드에서 BFS를 시작하여 lst 친구 그룹을 반환한다. 이후 res에 저장한다.

costs = 0
for r in res:
    cost = 10_000_001
    for ix in r:
        cost = min(cost, A[ix])
    costs += cost

print(costs if costs <= K else "Oh no")

각 그룹중에서 친구비가 최소인 친구와 친구를 맺도록 한다. 그때의 비용을 찾아 costs에 업데이트 해준다. 최종적으로 비용이 현재 가진 돈 보다 작다면 최소 비용일 것이고, 넘어간다면 Oh no를 출력한다.

🗒️ 최종 제출 코드

# 16562 친구비

from collections import deque

def bfs(n):
    Q = deque()
    Q.append(n)
    visited[n] = True

    lst = [n]
    while Q:
        c = Q.popleft()

        for ix in graph[c]:
            if not visited[ix]:
                visited[ix] = True
                Q.append(ix)
                lst.append(ix)

    return lst

N, M, K = map(int, input().split())
A = [0] + list(map(int, input().split()))

graph = [[] for _ in range(N+1)]
for _ in range(M):
    v, w = map(int, input().split())
    graph[v].append(w)
    graph[w].append(v)

visited = [False] * (N+1)

res = []
for i in range(1, N+1):
    if not visited[i]:
        res.append(bfs(i))

costs = 0
for r in res:
    cost = 10_000_001
    for ix in r:
        cost = min(cost, A[ix])
    costs += cost

print(costs if costs <= K else "Oh no")

💭 오늘의 회고

-

728x90
반응형
저작자표시 (새창열림)

'Coding-Test > 백준' 카테고리의 다른 글

[Python] 1024 수열의 합  (0) 2026.02.19
[Python] 13913 숨바꼭질 4  (0) 2026.01.31
[Python] 2234 성곽  (0) 2026.01.22
[Python] 28707 배열 정렬  (0) 2026.01.20
[Python] 9660 돌 게임 6  (0) 2026.01.20
'Coding-Test/백준' 카테고리의 다른 글
  • [Python] 1024 수열의 합
  • [Python] 13913 숨바꼭질 4
  • [Python] 2234 성곽
  • [Python] 28707 배열 정렬
희완
희완
희완한 코딩일상
    반응형
  • 희완
    Code-Heewan
    희완
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Python
        • 가상환경
      • Algorithm
      • Coding-Test
        • 백준
        • 프로그래머스
        • 항해99
      • Data-Analysis
      • 웹 개발
        • django
      • AWS
      • 공모전
      • Mobile
  • 링크

    • Github
  • 300x250
  • hELLO· Designed By정상우.v4.10.3
희완
[Python] 16562 친구비
상단으로

티스토리툴바