[158]友人-コード解析


質問: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)