반응형
문제
해커 김지민은 잘 알려진 어느 회사를 해킹하려고 한다. 이 회사는 N개의 컴퓨터로 이루어져 있다. 김지민은 귀찮기 때문에, 한 번의 해킹으로 여러 개의 컴퓨터를 해킹 할 수 있는 컴퓨터를 해킹하려고 한다.
이 회사의 컴퓨터는 신뢰하는 관계와, 신뢰하지 않는 관계로 이루어져 있는데, A가 B를 신뢰하는 경우에는 B를 해킹하면, A도 해킹할 수 있다는 소리다.
이 회사의 컴퓨터의 신뢰하는 관계가 주어졌을 때, 한 번에 가장 많은 컴퓨터를 해킹할 수 있는 컴퓨터의 번호를 출력하는 프로그램을 작성하시오.
문제풀이
import sys
from collections import deque
input = sys.stdin.readline
n,m=map(int,input().split())
#01
def bfs(start):
cnt=1
queue=deque([start])
visited=[0]*(n+1)
visited[start]=True
#02
while queue:
tmp=queue.popleft()
for x in graph[tmp]:
if not visited[x]:
visited[x]=True
cnt+=1
queue.append(x)
return cnt
graph=[[]for _ in range(n+1)]
for _ in range(m):
a,b=map(int,input().split())
#03
graph[b].append(a)
#04
max=1
ans=[]
for i in range(1,n+1):
cnt=bfs(i)
if cnt>max:
max=cnt
ans=[]
ans.append(i)
elif cnt==max:
ans.append(i)
print(*ans)
- #01 : 함수 bfs를 통해 1부터 시작하여 연결되어 있는 노드를 모두 방문하며
cnt의 값을 찾아내는 것이다.
- #02 : graph[tmp]의 값을 추출하여 x에 넣고 만약 visited[x]가 0이라면
즉 방문하지 않았다면, cnt에 1을 더하고 queue에 x를 추가하며 cnt의 개수를 구한다.
- #03 : graph는 A가 B를 신뢰하는 경우기 때문에 특수하게
graph[b].append(a) 하나만 작성해준다.
- #04 : 1부터 n까지 cnt 값을 찾으며 max값 보다 클 경우 cnt를 max로 바꾸고 ans에 추가한다.
cnt가 같을 경우 ans에 i값을 추가해준다.
최종적으로 ans를 한 줄에 출력한다.
'프로그래밍 > 백준' 카테고리의 다른 글
[알고리즘] 백준 24444 파이썬 - 알고리즘 수업 - 너비 우선 탐색 1 (2) | 2023.01.24 |
---|---|
[알고리즘] 백준 5567 파이썬 - 결혼식 (3) | 2023.01.23 |
[알고리즘] 백준 2257 파이썬 - 화학식량 (4) | 2023.01.20 |
[알고리즘] 백준 2910 파이썬 - 빈도 정렬 (3) | 2023.01.19 |
[알고리즘] 백준 5397 파이썬 - 키로거 (3) | 2023.01.18 |