백준 2660번 - 회장뽑기
회장뽑기 문제 바로 가기
풀이 날짜: 2026-03-22
baekjoon 알고리즘 문제 풀이
풀이 코드
from collections import deque
import sys
input = sys.stdin.readline
INF = int(1e9)
n = int(input())
graph = [[INF] * (n+1) for _ in range(n+1)]
for i in range(1,n+1):
graph[i][i] = 0
while True:
a,b = map(int, input().split())
if a == -1 and b == -1:
break
graph[a][b] = 1
graph[b][a] = 1
for k in range(1,n+1):
for i in range(1,n+1):
for j in range(1,n+1):
graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j])
score = [0] * (n+1)
for i in range(1,n+1):
score[i] = max(graph[i][1:n+1])
min_score = min(score[1:])
answer = []
for i in range(1,n+1):
if score[i] == min_score:
answer.append(i)
print(min_score, len(answer))
print(*answer)
접근 방법
이 문제의 목표는 모든 회원 중에서 “회장 후보”를 찾는 것이며, 회장 후보는 다른 모든 회원과의 거리가 가장 가까운 사람으로 정의된다.
핵심 아이디어 - 점수 의미
각 회원의 점수는 “다른 모든 회원까지의 최단 거리 중 가장 큰 값”으로 정의된다. 즉, 특정 회원을 기준으로 다른 모든 회원까지 가는 데 필요한 최소 친구 단계 수를 구하고, 그중 가장 먼 거리 값을 그 회원의 점수로 삼는다. 이 값이 작을수록 다른 사람들과 가까운 관계를 유지하고 있다는 의미가 된다.
각 회원의 점수 계산
각 회원을 기준으로 다른 모든 회원까지의 최단 거리를 계산한다. 예를 들어 1번 회원은 2번까지는 1단계, 3번과 4번까지는 2단계, 5번까지는 3단계가 걸린다. 따라서 가장 먼 거리인 3이 1번의 점수가 된다. 같은 방식으로 계산하면 2번, 3번, 4번은 가장 먼 거리까지의 값이 모두 2이며, 5번은 다시 3이 된다.
전체 점수 정리
모든 회원의 점수를 정리하면 다음과 같다.
- 1번: 3, 2번: 2, 3번: 2, 4번: 2, 5번: 3 이 중 가장 작은 값은 2이며, 이 값을 가진 회원들이 회장 후보가 된다.
최종 결과 해석
최소 점수는 2이고, 해당 점수를 가진 회원은 2번, 3번, 4번 총 3명이다. 따라서 출력은 “2 3”과 “2 3 4”가 된다. 첫 번째 줄은 회장 후보의 점수와 후보 수를 의미하고, 두 번째 줄은 후보 회원 번호를 오름차순으로 나열한 것이다.
내가 헷갈렸던 포인트
이 문제는 단순히 최단 거리만 구하는 것이 아니라, 그 결과를 활용해 각 노드의 중심성을 판단하는 문제였다. 특히 플로이드 워셜을 통해 구한 거리 정보를 기반으로 최댓값을 활용하는 방식이 헷갈렸다.