[백준/Python] 1325_효율적인 해킹

2021. 7. 2. 15:02백준 알고리즘

문제

https://www.acmicpc.net/problem/1325

 

1325번: 효율적인 해킹

첫째 줄에, N과 M이 들어온다. N은 10,000보다 작거나 같은 자연수, M은 100,000보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에 신뢰하는 관계가 A B와 같은 형식으로 들어오며, "A가 B를 신뢰한

www.acmicpc.net

코드

import sys
from collections import deque


def bfs(start):
    q = deque([start])
    visited = [False] * (n + 1)  # 방문 여부 기록
    visited[start] = True  # 해킹 시작 노드는 방문 체크
    hacking_cnt = 1  # 해킹 횟수
    while q:
        com = q.popleft()
        for i in graph[com]:
            if not visited[i]:
                q.append(i)
                visited[i] = True
                hacking_cnt += 1
    return hacking_cnt


n, m = map(int, sys.stdin.readline().rstrip().split())
graph = [[] for _ in range(n + 1)]
for _ in range(m):
    A, B = map(int, sys.stdin.readline().rstrip().split())
    graph[B].append(A)

answer = []  # 한번에 가장 많은 해킹을 할 수 있는 컴퓨터 번호들을 저장
max_cnt = 1  # 가장 많이 해킹할 때 해킹 수
for i in range(1, n + 1):
    cnt = bfs(i)
    if max_cnt < cnt:
        answer = [i]  # 초기화
        max_cnt = cnt  # 해킹 수 초기화
    elif max_cnt == cnt:
        answer.append(i)
answer.sort()
print(' '.join(map(str, answer)))

풀이

(n + 1) 의 행을 가진 2차원 배열 graph를 선언합니다.

m 만큼 반복문을 돌면서 A, B를 입력받고 graph[B]에 A를 append합니다.

A가 B를 신뢰하기 때문에 B가 해킹당하면 연쇄적으로 A도 해킹당하게 됩니다.

 

BFS를 이용하여 시작 노드를 매개변수로 해킹 횟수를 구하는 함수를 선언합니다.

 

한번에 가장 많은 해킹을 할 수 있는 시작 노드를 저장하는 리스트 answer와

가장 많이 해킹할 때 해킹 수를 저장하는 max_cnt를 선언합니다.

bfs를 호출하여 나온 결과값을 cnt라고 할 때,

cnt가 max_cnt보다 크면, 새로운 최대 최대 해킹수가 나왔다는 뜻이므로 answer와 max_cnt를 초기화 합니다.

cnt가 max_cnt와 같으면, 최대 해킹수 같은 노드가 나왔다는 뜻이므로 answer에 노드를 추가합니다.

최종적으로, answer의 값을 출력하면 답이 됩니다.

 

 

 

'백준 알고리즘' 카테고리의 다른 글

[백준/Python] 2294_동전2  (0) 2021.07.03
[백준/Python] 1080_행렬  (0) 2021.07.03
[백준/Python] 18870_ 좌표 압축  (0) 2021.07.02
[백준/Python] 9020_골드바흐의 추측  (0) 2021.07.01
[백준/Python] 10026_적록색약  (0) 2021.07.01