[1058] 친구 - 코드 해석

Sarah·2022년 3월 18일
0

BaekJoon

목록 보기
6/8

문제 : 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)

profile
2021.06 ~

0개의 댓글

관련 채용 정보