라떼는말이야

[solved.ac 실버2] 1058_친구 (파이썬, 브루트포스, 그래프) 본문

알고리즘/코딩 테스트

[solved.ac 실버2] 1058_친구 (파이썬, 브루트포스, 그래프)

MangBaam 2022. 4. 17. 03:54
반응형

제한 사항

문제

지민이는 세계에서 가장 유명한 사람이 누구인지 궁금해졌다. 가장 유명한 사람을 구하는 방법은 각 사람의 2-친구를 구하면 된다. 어떤 사람 A가 또다른 사람 B의 2-친구가 되기 위해선, 두 사람이 친구이거나, A와 친구이고, B와 친구인 C가 존재해야 된다. 여기서 가장 유명한 사람은 2-친구의 수가 가장 많은 사람이다. 가장 유명한 사람의 2-친구의 수를 출력하는 프로그램을 작성하시오.

A와 B가 친구면, B와 A도 친구이고, A와 A는 친구가 아니다.

입력

첫째 줄에 사람의 수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 각 사람이 친구이면 Y, 아니면 N이 주어진다.

출력

첫째 줄에 가장 유명한 사람의 2-친구의 수를 출력한다.

예제

 


나의 풀이

DFS나 BFS로 풀 수도 있겠지만 N이 50보다 작은 자연수이기 때문에 세제곱을 해도 시간 내에 충분히 풀 수 있을 것이라 생각되어 모든 경우를 탐색하는 브루트포스 방식으로 풀이했다.

풀이는 코드의 주석만 해도 충분히 설명할 수 있다고 생각되어 주절 주절 적진 않겠다.

n = int(input())
arr = [list(input()) for _ in range(n)]
answer = 0

for i in range(n): # 모든 경우 탐색
    friend = 0
    for j in range(n): # i와 j가 친구인가?
        if i == j: continue # 나는 나와 친구가 될 수 없다...
        if arr[i][j] == 'Y': # i와 j가 친구다
            friend += 1
        elif arr[i][j] == 'N': # i와 j가 친구가 아니다
            for k in range(n): # j의 친구들 탐색
                if arr[j][k] == 'Y' and arr[i][k] == 'Y': # j와 k가 친구고, i와 k도 친구다
                    friend += 1
                    break # 2-친구가 한 명이라도 있으면 더 찾지 않는다
    answer = max(answer, friend)
print(answer)

채점 결과

반응형
Comments