코드

Pypy3 정답

from collections import deque

n, m = map(int, input().split())
graph = [[] for _ in range(n+1)]

for _ in range(m):
    a, b = map(int, input().split())

    # a가 b를 신뢰한다 => b를 해킹하면 a도 해킹된다
    # ==> b에서 a로만 방향이 있는 단방향 그래프이다!!!
    graph[b].append(a)

# 각각의 컴퓨터에서 해킹 가능한 개수를 담을 리스트
result = [0]

# BFS 수행
def bfs(v):
    q = deque()
    q.append(v)
    
    visited = [False for _ in range(n+1)]
    visited[v] = True
    
    # 해킹 가능한 컴퓨터의 수를 담을 변수
    cnt = 0
    
    while q:
        nv = q.popleft()
        
        for i in graph[nv]:
            if not visited[i]:
                q.append(i)
                visited[i] = True
                
                # 해킹 하나 했으므로 +1
                cnt += 1
                
    # deque가 비면 cnt 반환            
    return cnt

# 각 컴퓨터에 대하여 bfs 수행 후, 그 결과를 result에 저장
for i in range(1, n+1):
    result.append(bfs(i))

# result 중 가장 큰 값의 인덱스 번호를 출력 => 컴퓨터의 번호 오름차순 출력하라는 조건과 일치
for i in range(len(result)):
    if result[i] == max(result):
        print(i, end = ' ')

문제 해설

전형적인 BFS 문제.

이 문제는 Pypy3을 사용하지 않으면 시간 초과에서 벗어나지 못하였다 ㅠㅠ…

문제 자체의 풀이는 간단하나 문제 자체를 이해하기 힘들 수 있는 부분이 있다.


* A 컴퓨터가 B 컴퓨터를 신뢰하는 경우, B 컴퓨터를 해킹하면 A 컴퓨터도 해킹할 수 있음*


위의 조건이 의미하는 바는 결국 B 컴퓨터에서 A 컴퓨터만으로의 이동이 가능하다는 의미이므로 B => A의 단방향 그래프가 주어진다는 뜻과 같다. 따라서

for _ in range(m):
    a, b = map(int, input().split())

    # a가 b를 신뢰한다 => b를 해킹하면 a도 해킹된다
    # ==> b에서 a로만 방향이 있는 단방향 그래프이다!!!
    graph[b].append(a)

그래프의 입력이 위와 같은 방식으로 이루어진다.

이를 제외하곤 별 다른 어려움 없이 풀 수 있는 문제였으나, 시간 초과를 해결할 수 있는 방법 또한 참고하여 다시 한 번 풀어봐야겠다.

댓글남기기