맛있는물회

[맛있는물회] [파이썬] <백준 알고리즘> 2660번 "회장뽑기" 본문

IT/알고리즘

[맛있는물회] [파이썬] <백준 알고리즘> 2660번 "회장뽑기"

맛있는물회 2020. 6. 30. 00:01

문제 조건


월드컵 축구의 응원을 위한 모임에서 회장을 선출하려고 한다. 이 모임은 만들어진지 얼마 되지 않았기 때문에 회원 사이에 서로 모르는 사람도 있지만, 몇 사람을 통하면 모두가 서로 알 수 있다. 각 회원은 다른 회원들과 가까운 정도에 따라 점수를 받게 된다.

예를 들어 어느 회원이 다른 모든 회원과 친구이면, 이 회원의 점수는 1점이다. 어느 회원의 점수가 2점이면, 다른 모든 회원이 친구이거나 친구의 친구임을 말한다. 또한 어느 회원의 점수가 3점이면, 다른 모든 회원이 친구이거나, 친구의 친구이거나, 친구의 친구의 친구임을 말한다.

4점, 5점 등은 같은 방법으로 정해진다. 각 회원의 점수를 정할 때 주의할 점은 어떤 두 회원이 친구사이이면서 동시에 친구의 친구사이이면, 이 두사람은 친구사이라고 본다.

회장은 회원들 중에서 점수가 가장 작은 사람이 된다. 회장의 점수와 회장이 될 수 있는 모든 사람을 찾는 프로그램을 작성하시오.

 

Input


입력의 첫째 줄에는 회원의 수가 있다. 단, 회원의 수는 50명을 넘지 않는다. 둘째 줄 이후로는 한 줄에 두 개의 회원번호가 있는데, 이것은 두 회원이 서로 친구임을 나타낸다. 회원번호는 1부터 회원의 수만큼 붙어 있다. 마지막 줄에는 -1이 두 개 들어있다.

 

Output


첫째 줄에는 회장 후보의 점수와 후보의 수를 출력하고, 두 번째 줄에는 회장 후보를 오름차순으로 모두 출력한다.

 

 

생각한 아이디어


플로이드 와샬 알고리즘을 사용하는 문제이다.

 

사실 플로이드 와샬 알고리즘이 기억이 나지 않아서 로직을 조금 찾아봐서 풀었다.

 

플로이드 와샬 알고리즘에 대해서는 

https://blog.naver.com/PostView.nhn?blogId=ndb796&logNo=221234427842&parentCategoryNo=&categoryNo=128&viewDate=&isShowPopularPosts=false&from=postView

 

24. 플로이드 와샬(Floyd Warshall) 알고리즘

지난 시간에는 다익스트라(Dijkstra) 알고리즘에 대해 학습했습니다. 다익스트라 알고리즘은 하나의 정점...

blog.naver.com

동빈나님을 참고하면 아주 쉽게 알 수 있다.

 

어쨌든 이 문제에서는 모든 회원들의 레벨을 알아야하기 때문에

모든 정점에서 모든 정점으로 가는 경로를 찾아서 계산해야하는 문제이다.

 

모든 경로를 구하고 나면, 그 값의 최대값을 가지고 레벨을 주면 된다.

값이 가장 낮은 사람이 회장이니깐 회장을 구하고, 회장 수와, 누가 회장인지를 구하면 된다.

 

소스코드


#2660 회장뽑기

import sys
from collections import deque
input=sys.stdin.readline
inf=sys.maxsize

n=int(input())
arr=[[inf for _ in range(n+1)] for _ in range(n+1)]
for i in range(1,n+1): arr[i][i]=0

while 1:
   a,b=map(int,input().split())
   if a==-1:break
   arr[a][b]=1
   arr[b][a]=1

for k in range(1,n+1):
   for i in range(1,n+1):
      for j in range(1,n+1):
         if arr[i][j]>arr[i][k]+arr[k][j]:
            arr[i][j]=arr[i][k]+arr[k][j]
ans,res=[],[]
for i in range(1,n+1):
   ans.append(max(arr[i][1:n+1]))
MIN=min(ans)
print(MIN, ans.count(MIN))
for i in range(0,n):
   if ans[i]==MIN:res.append(i+1)
print(*res)

 

*파이썬 문법 정리

Comments