지민이는 세계에서 가장 유명한 사람이 누구인지 궁금해졌다. 가장 유명한 사람을 구하는 방법은 각 사람의 2-친구를 구하면 된다. 어떤 사람 A가 또다른 사람 B의 2-친구가 되기 위해선, 두 사람이 친구이거나, A와 친구이고, B와 친구인 C가 존재해야 된다. 여기서 가장 유명한 사람은 2-친구의 수가 가장 많은 사람이다. 가장 유명한 사람의 2-친구의 수를 출력하는 프로그램을 작성하시오.
A와 B가 친구면, B와 A도 친구이고, A와 A는 친구가 아니다.
입력
첫째 줄에 사람의 수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 각 사람이 친구이면 Y, 아니면 N이 주어진다.
출력
첫째 줄에 가장 유명한 사람의 2-친구의 수를 출력한다.
풀이 과정
사람마다 2-친구 수를 세서 가장 많은 결과를 출력한다.
2-친구가 되려면 서로 친구거나, 한 다리 건너 알아야 하므로, BFS를 사용해 도달 시간이 2 이하인 정점 개수가 답이 된다.
import sys
from collections import deque
input = sys.stdin.readline
n = int(input().rstrip())
maps = [list(input().rstrip()) for _ in range(n)]
graph = [[] for _ in range(n)]
for i in range(n):
for j in range(n):
if i == j: continue
if maps[i][j] == 'Y': graph[i].append(j)
visited = [0 for _ in range(50)]
max_cnt = 0
for i in range(n):
queue = deque()
queue.append(i)
visited[i] = i+1
time = 0
cnt = -1
while queue and time <= 2:
size = len(queue)
for s in range(size):
now = queue.popleft()
cnt += 1
for next in graph[now]:
if visited[next] != i+1:
visited[next] = i+1
queue.append(next)
time += 1
max_cnt = max(max_cnt, cnt)
print(max_cnt)
'-- 예전 기록 > BOJ' 카테고리의 다른 글
[ BOJ ] 20365 : 블로그2 ( SILVER 3 ) / Python (0) | 2024.02.17 |
---|---|
[ BOJ ] 12761 : 돌다리 ( SILVER 1 ) / Python (0) | 2024.02.15 |
[ BOJ ] 17952 : 과제는 끝나지 않아! ( SILVER 3 ) / Python (0) | 2024.02.15 |
[ BOJ ] 15970 : 화살표 그리기 ( SILVER 4 ) / Python (0) | 2024.02.15 |
[ BOJ ] 25325 : 학생 인기도 측정 ( SILVER 5 ) / Python (0) | 2024.02.15 |