새소식

PS/CodeUp

[CodeUp/4433] 회장뽑기 (Python)

  • -

Problem : 회장뽑기 (codeup.kr)

Status : Solved

Time : 00:11:04

 


 

문제 설명

 

더보기

문제3)

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

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

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

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

 

입력 및 출력

 

더보기

입력

첫째 줄에는 회원의 수가 있다. 단, 회원의 수는 50명을 넘지 않는다.

둘째 줄 이후로는 한 줄에 두 개의 회원번호가 있는데, 이것은 두 회원이 서로 친구임을 나타낸다.

회원번호는 1부터 회원의 수만큼 붙어 있다. 마지막 줄에는 -1이 두 개 들어있다.

 

출력

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

 

입력 예시

5

1 2

2 3

3 4

4 5

2 4

5 3

-1 -1

 

출력 예시

2 3

2 3 4

 

 


 

풀이

 

총 N의 개수가 최대 50개인 점, 각 node의 최대 깊이(여기서는 최대 친구 관계 깊이)를 구해야 한다는 점을 볼 때, 플로이드-와셜 알고리즘을 사용해야 함을 알 수 있다.

 

https://ko.wikipedia.org/wiki/%ED%94%8C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%9B%8C%EC%85%9C_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

 

플로이드-워셜 알고리즘 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 컴퓨터 과학에서 플로이드-워셜 알고리즘(Floyd-Warshall Algorithm)은 변의 가중치가 음이거나 양인 (음수 사이클은 없는) 가중 그래프에서 최단 경로들을 찾는 알고

ko.wikipedia.org

 

(아예 이러한 알고리즘들을 따로 정리해서 포스팅하는 것도 공부에 도움이 될 것 같은데... 일단은 위키피디아 링크로 설명을 대체한다.)

 

여기서 최대 거리가 가장 짧은 node들만을 따로 골라주면 된다.

 

풀이 코드

N = int(input())

map_list = [[float('inf')]*N for _ in range(N)]

while True :
  a, b = map(int, input().split())
  if a == b == -1 :
    break
  map_list[a-1][b-1] = map_list[b-1][a-1] = 1
for i in range(N):
  map_list[i][i] = 0


for k in range(N):
  for i in range(N):
    for j in range(N) :
      if map_list[i][j] > map_list[i][k] + map_list[k][j] :
        map_list[i][j] = map_list[i][k] + map_list[k][j]

dist_list = [ max(map_list[i]) for i in range(N) ]

chairman_val = min(dist_list)
chairman_list = list()

for i in range(N):
  if dist_list[i] == chairman_val :
    chairman_list.append(i+1)

print(chairman_val, len(chairman_list))
print(*chairman_list)

풀이 완료

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.