문제)
지민이는 세계에서 가장 유명한 사람이 누구인지 궁금해졌다. 가장 유명한 사람을 구하는 방법은 각 사람의 2-친구를 구하면 된다. 어떤 사람 A가 또다른 사람 B의 2-친구가 되기 위해선, 두 사람이 친구이거나, A와 친구이고, B와 친구인 C가 존재해야 된다. 여기서 가장 유명한 사람은 2-친구의 수가 가장 많은 사람이다. 가장 유명한 사람의 2-친구의 수를 출력하는 프로그램을 작성하시오.
A와 B가 친구면, B와 A도 친구이고, A와 A는 친구가 아니다.
입력)
첫째 줄에 사람의 수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 각 사람이 친구이면 Y, 아니면 N이 주어진다.
출력)
첫째 줄에 가장 유명한 사람의 2-친구의 수를 출력한다.
from sys import stdin; input=stdin.readline
N = int(input().strip())
friends = {idx:[] for idx in range(N)}
for i in range(N):
relation = input().strip()
for j, f in enumerate(relation):
if f == 'Y': friends[i].append(j)
result = 0
for key in friends.keys():
tmp = set(friends[key].copy())
for v in friends[key]:
tmp |= set(friends[v])
result = max(result, len(set(tmp))-1)
print(result)
풀이 :
우선 5 - 8 번줄을 통해 총 N명 (0 번 ~ N-1 번) 까지의 관계를 정리한다. 그 결과 friends라는 딕셔너리에는 n번째 사람과 친구인 사람들이 정리될 것이다.
그 후에 11 - 15 번 줄을 통해 2-친구수를 구하면 된다. 이 때 n의 2-친구수를 구하는 공식은
n의 친구들의 친구들 전체의 집합 - 본인
이다.
예를 들어 문제의 예제 4 번을 보자.

위의 표를 참고하였을 때, 0번의 2-친구 수를 구해보자. 우선 0의 친구는 [4] 한명이다. 그리고 4번의 친구는 [0, 1, 2, 9] 총 4명이다. 이 둘의 집합은 [0, 1, 2, 4, 9]가 된다. 이 때 0의 2-친구 수를 구하는 것이므로 본인(0)은 제외한 수를 세어주면 된다. 그러므로 0의 2-친구 수는 4가 된다.
이번에는 1의 2-친구 수를 구해보자. 1의 친구는 [4, 6, 7] 총 3명이 된다. [4]의 친구는 [0, 1, 2, 9], [6]의 친구는 [1, 7] 마지막으로 [7]의 친구는 [1, 6]이다. 이 들의 총 집합은 [0, 1, 2, 4, 6, 7, 9]가 되고 마찬가지로 본인(1)을 제외한 6명이 1의 2-친구 수가 된다.
위의 과정을 N번 반복한 뒤 가장 큰 수가 해당 문제의 정답이 된다.
'~2025' 카테고리의 다른 글
| 프로그래머스) 구명보트 [파이썬3] (0) | 2022.10.19 |
|---|---|
| 백준) 1063 - 킹 [파이썬 3] (0) | 2022.10.10 |
| 백준) 1057 - 토너먼트 [파이썬3] (1) | 2022.10.05 |
| 백준) 1158 - 요세푸스 문제 [파이썬3] (0) | 2022.10.04 |
| 백준) 25425 - 운동회 [파이썬 3] (0) | 2022.08.17 |