문제
- 해커 김지민은 잘 알려진 어느 회사를 해킹하려고 한다.
- 이 회사는 N개의 컴퓨터로 이루어져 있다.
- 김지민은 귀찮기 때문에, 한 번의 해킹으로 여러 개의 컴퓨터를 해킹 할 수 있는 컴퓨터를 해킹하려고 한다.
- 이 회사의 컴퓨터는 신뢰하는 관계와, 신뢰하지 않는 관계로 이루어져 있는데, A가 B를 신뢰하는 경우에는 B를 해킹하면, A도 해킹할 수 있다는 소리다.
- 이 회사의 컴퓨터의 신뢰하는 관계가 주어졌을 때, 한 번에 가장 많은 컴퓨터를 해킹할 수 있는 컴퓨터의 번호를 출력하는 프로그램을 작성하시오.
- N은 10,000보다 작거나 같은 자연수, M은 100,000보다 작거나 같은 자연수이다.
- M개의 줄에 신뢰하는 관계가 A B와 같은 형식으로 들어오며, "A가 B를 신뢰한다"를 의미한다.
- 컴퓨터는 1번부터 N번까지 번호가 하나씩 매겨져 있다.
- 김지민이 한 번에 가장 많은 컴퓨터를 해킹할 수 있는 컴퓨터의 번호를 오름차순으로 출력한다.
알고리즘
- 시간초과로 인해 pypy3을 통해 문제를 제출했다.
- bfs를 통해 문제를 수행한다.
- A, B 컴퓨터가 있으면 B를 해킹했을 때 A도 해킹할 수 있게 되는 것을 생각하고 문제를 풀면 된다.
코드
import sys
from collections import deque
# bfs 탐색
def bfs(v):
cnt = 0
q = deque([v])
visited = [False] * (n + 1)
visited[v] = True
# 큐에 탐색해야 하는 노드 없을 때까지 실행
while q:
a = q.popleft()
cnt += 1
# 해킹하지 않았으면 해킹을 한다.
for j in graph[a]:
if not visited[j]:
visited[j] = True
q.append(j)
# 방문한 정점의 수를 리턴
return cnt
n, m = map(int, sys.stdin.readline().split())
# 2차원 리스트의 맵 정보를 입력 받는다.
graph = [[] for _ in range(n + 1)]
for _ in range(m):
x, y = map(int, sys.stdin.readline().split())
graph[y].append(x)
cnt_max = 0
result = []
for i in range(1, n + 1):
if graph[i]:
tmp = bfs(i)
# bfs를 통해 리턴값을 받고 최대값과 비교
if cnt_max <= tmp:
# 최대값이 더 작으면 결과값을 초기화한다.
if cnt_max < tmp:
result = []
cnt_max = tmp
result.append(i)
print(*result)
github
'CodingTest > Baekjoon' 카테고리의 다른 글
[baekjoon] 백준 2644번(파이썬): 촌수계산 (0) | 2021.07.30 |
---|---|
[baekjoon] 백준 2210번(파이썬): 숫자판 점프 (0) | 2021.07.29 |
[baekjoon] 백준 16956번(파이썬): 늑대와 양 (0) | 2021.07.27 |
[baekjoon] 백준 9372번(파이썬): 상근이의 여행 (0) | 2021.07.26 |
[baekjoon] 백준 16173번(파이썬): 쩰리 (Small) (2) | 2021.07.24 |