728x90
반응형
https://www.acmicpc.net/problem/1325
문제
해커 김지민은 잘 알려진 어느 회사를 해킹하려고 한다. 이 회사는 N개의 컴퓨터로 이루어져 있다. 김지민은 귀찮기 때문에, 한 번의 해킹으로 여러 개의 컴퓨터를 해킹 할 수 있는 컴퓨터를 해킹하려고 한다.
이 회사의 컴퓨터는 신뢰하는 관계와, 신뢰하지 않는 관계로 이루어져 있는데, A가 B를 신뢰하는 경우에는 B를 해킹하면, A도 해킹할 수 있다는 소리다.
이 회사의 컴퓨터의 신뢰하는 관계가 주어졌을 때, 한 번에 가장 많은 컴퓨터를 해킹할 수 있는 컴퓨터의 번호를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에, N과 M이 들어온다. N은 10,000보다 작거나 같은 자연수, M은 100,000보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에 신뢰하는 관계가 A B와 같은 형식으로 들어오며, "A가 B를 신뢰한다"를 의미한다. 컴퓨터는 1번부터 N번까지 번호가 하나씩 매겨져 있다.
출력
첫째 줄에, 김지민이 한 번에 가장 많은 컴퓨터를 해킹할 수 있는 컴퓨터의 번호를 오름차순으로 출력한다.
풀이
Code
import sys
from collections import deque
input = sys.stdin.readline
# 1. bfs 함수 정의
def bfs(x) :
# 1-4-1. 큐에 현재 위치 삽입
queue = deque([x])
# 1-2. 방문 여부 리스트 생성
visited = [False] * (n+1)
# 1-3. 현재 위치 방문 처리
visited[x] = True
cnt = 1
# 1-4.
while queue :
# 1-4-1. 위치 인덱스 반환
x = queue.popleft()
# 1-4-2.
for nx in relationship[x] :
# 방문한 적이 없는 경우
if not visited[nx] :
# 방문 처리
visited[nx] = True
# 카운팅
cnt += 1
# 큐에 다음 위치 삽입
queue.append(nx)
# 1-5. 카운트 반환
return cnt
n, m = map(int, input().split())
# 2. 신뢰 관계 리스트 생성
relationship = [[] for _ in range(n+1)]
for _ in range(m) :
a, b = map(int, input().split())
relationship[b].append(a)
# 3. 출력 리스트 생성
ans = []
max_ = -int(1e9)
# 4.
for i in range(1, n+1) :
cnt = bfs(i)
# 4-1. 최대 해킹 횟수와 같을 경우
if cnt == max_ : ans.append(i)
# 4-2. 최대 해킹 횟수보다 클 경우
elif cnt > max_ :
ans = [i]
max_ = cnt
# 5. 결과 출력
print(*ans)
728x90
반응형
'Coding Test > Baekjoon' 카테고리의 다른 글
[Python/BOJ] 1484. 다이어트 (0) | 2023.09.02 |
---|---|
[Python/BOJ] 1911. 흙길 보수하기 (0) | 2023.09.02 |
[Python/BOJ] 15812. 침략자 진아 (0) | 2023.09.02 |
[Python/BOJ] 2290. LCD Test (0) | 2023.09.02 |
[Python/BOJ] 2580. 스도쿠 (1) | 2023.08.21 |