일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 월드프렌즈
- 테를지
- 몽골
- 파이썬
- 백준
- LG글로벌챌린저
- ICT봉사단
- 몽골 고기
- 헬스
- 월드프렌즈 ICT 봉사단
- 초원
- 소프트웨어 아카데미
- algorithm
- 테를지국립공원
- 칭기즈칸
- 게르
- 몽골요리
- Python
- 여행
- SWEA
- 울란바토르
- 아부다비
- 몽골 헬스장
- 코로나
- 한 줄로 서기
- 담슈타트
- 칭기스칸 동상
- 독일
- 알고리즘
- 교환학생
- Today
- Total
맛있는물회
[맛있는물회] [파이썬] <백준 알고리즘> 2660번 "회장뽑기" 본문
문제 조건
월드컵 축구의 응원을 위한 모임에서 회장을 선출하려고 한다. 이 모임은 만들어진지 얼마 되지 않았기 때문에 회원 사이에 서로 모르는 사람도 있지만, 몇 사람을 통하면 모두가 서로 알 수 있다. 각 회원은 다른 회원들과 가까운 정도에 따라 점수를 받게 된다.
예를 들어 어느 회원이 다른 모든 회원과 친구이면, 이 회원의 점수는 1점이다. 어느 회원의 점수가 2점이면, 다른 모든 회원이 친구이거나 친구의 친구임을 말한다. 또한 어느 회원의 점수가 3점이면, 다른 모든 회원이 친구이거나, 친구의 친구이거나, 친구의 친구의 친구임을 말한다.
4점, 5점 등은 같은 방법으로 정해진다. 각 회원의 점수를 정할 때 주의할 점은 어떤 두 회원이 친구사이이면서 동시에 친구의 친구사이이면, 이 두사람은 친구사이라고 본다.
회장은 회원들 중에서 점수가 가장 작은 사람이 된다. 회장의 점수와 회장이 될 수 있는 모든 사람을 찾는 프로그램을 작성하시오.
Input
입력의 첫째 줄에는 회원의 수가 있다. 단, 회원의 수는 50명을 넘지 않는다. 둘째 줄 이후로는 한 줄에 두 개의 회원번호가 있는데, 이것은 두 회원이 서로 친구임을 나타낸다. 회원번호는 1부터 회원의 수만큼 붙어 있다. 마지막 줄에는 -1이 두 개 들어있다.
Output
첫째 줄에는 회장 후보의 점수와 후보의 수를 출력하고, 두 번째 줄에는 회장 후보를 오름차순으로 모두 출력한다.
생각한 아이디어
플로이드 와샬 알고리즘을 사용하는 문제이다.
사실 플로이드 와샬 알고리즘이 기억이 나지 않아서 로직을 조금 찾아봐서 풀었다.
플로이드 와샬 알고리즘에 대해서는
동빈나님을 참고하면 아주 쉽게 알 수 있다.
어쨌든 이 문제에서는 모든 회원들의 레벨을 알아야하기 때문에
모든 정점에서 모든 정점으로 가는 경로를 찾아서 계산해야하는 문제이다.
모든 경로를 구하고 나면, 그 값의 최대값을 가지고 레벨을 주면 된다.
값이 가장 낮은 사람이 회장이니깐 회장을 구하고, 회장 수와, 누가 회장인지를 구하면 된다.
소스코드
#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)
*파이썬 문법 정리
'IT > 알고리즘' 카테고리의 다른 글
[맛있는물회] [파이썬] <백준 알고리즘> 1238번 "파티" (0) | 2020.07.01 |
---|---|
[맛있는물회] [파이썬] <백준 알고리즘> 11404번 "플로이드" (0) | 2020.06.30 |
[맛있는물회] [파이썬] <백준 알고리즘> 1389번 "케빈 베이컨의 6단계 법칙" (0) | 2020.06.28 |
[맛있는물회] [파이썬] <백준 알고리즘> 2606번 "바이러스" (0) | 2020.06.28 |
[맛있는물회] [파이썬] <백준 알고리즘> 1781번 "컵라면" (1) | 2020.06.27 |