문제 : https://www.acmicpc.net/problem/1058
지민이는 세계에서 가장 유명한 사람이 누구인지 궁금해졌다. 가장 유명한 사람을 구하는 방법은 각 사람의 2-친구를 구하면 된다. 어떤 사람 A가 또다른 사람 B의 2-친구가 되기 위해선, 두 사람이 친구이거나, A와 친구이고, B와 친구인 C가 존재해야 된다. 여기서 가장 유명한 사람은 2-친구의 수가 가장 많은 사람이다. 가장 유명한 사람의 2-친구의 수를 출력하는 프로그램을 작성하시오.
A와 B가 친구면, B와 A도 친구이고, A와 A는 친구가 아니다.
import sys
sys.stdin = open("input.txt")
import collections
def bfs(me):
cnt = 0
my_f = [me]
# 내 친구들에 본인을 포함시키기 -> 밑에 while문에서 이유가 나옴.
s = collections.deque() # 조건에 맞는 친구들 저장소
# 나랑 바로 연결된 친구들만 my_f에 넣고 cnt도 올림(문제조건에 맞는친구니까)
for i in range(T):
if graph[me][i] == 'Y':
my_f.append(i)
s.append(i)
cnt += 1
# 나랑 바로 연결된 친구들의 친구(= 건너친구)를 구하기 위한 while문
# 현재 s에 있는 친구들이 바로 친구니까 이친구들의 건너친구들만 파악하면 딱 건너친구(2미만)이다.
while s:
temp = s.popleft()
# 바로친구의 친구들 탐색
for i in range(T):
# 내 바로 친구가 아니면서 / 바로친구의 친구이면
if i not in my_f and graph[temp][i] == 'Y':
cnt += 1
my_f.append(i) # 조건맞으면 내친구로 등록
return cnt
T = int(input())
graph = [list(input()) for _ in range(T)]
res = 0
for i in range(T):
res = max(res, bfs(i)) # 최대값으로 res 갱신
print(res)