-- 예전 기록/BOJ

[ BOJ ] 1058 : 친구 ( SILVER 2 ) / Python

rejo 2024. 2. 15. 21:57

지민이는 세계에서 가장 유명한 사람이 누구인지 궁금해졌다. 가장 유명한 사람을 구하는 방법은 각 사람의 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)