algorithm/Floyd-Warshall

[백준1058/실버2] 친구 - Python

ayeongjin 2025. 3. 7. 20:52

https://www.acmicpc.net/problem/1058

 

2-친구가 가장 많을떄, 그 2-친구 수를 출력하는 문제였다.

(A와 B가 2-친구 되는 법 : A,B가 서로 친구이거나, 겹지인 C 존재)

 

그래서 브루트포스로 n번 사람의 2-친구 수를 전부 구해서 계산했다.

 

# 성공 코드

# 단순 그래프 탐색
# python 32412 KB 48 ms

N = int(input())
adjl = [input() for _ in range(N)]

def friend(a, b):
	
    # 서로 친구인 경우
    if adjl[a][b] == 'Y':
        return True
	
    # 겹지인이 존재할 경우
    for f in range(N):
        if f == a or f == b:
            continue
        if adjl[f][a] == 'Y' and adjl[f][b] == 'Y':
            return True

    return False

result = 0

for i in range(N):
    cnt = 0 # i의 2-친구 수
    
    for j in range(N):
        if i == j:
            continue
        if friend(i, j): # i와 j가 2-친구이면 cnt += 1
            cnt += 1

    result = max(result, cnt)

print(result)

 

 

풀고보니 플로이드-워셜 문제로 풀 수 있어서 시간복잡도는 커지겠지만 다시 한번 풀어봤다.

 

# 플로이드 워셜
# python 32412 KB 92 ms

N = int(input())
adjl = [input() for _ in range(N)]
dist = [[float('inf')] * N for _ in range(N)]

# 친구 관계 (Y면 거리 1, 본인은 거리 0)
for i in range(N):
    for j in range(N):
        if i == j:
            dist[i][j] = 0
        elif adjl[i][j] == 'Y':
            dist[i][j] = 1

# 플로이드-워셜
for k in range(N):
    for i in range(N):
        for j in range(N):
            dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])

# 2-친구 수 계산
result = 0
for i in range(N):
	# 거리가 2 이하라면 2-친구 가능
    cnt = sum(1 for j in range(N) if i != j and dist[i][j] <= 2)
    result = max(result, cnt)

print(result)