CodingTest/Baekjoon

[baekjoon] 백준 1325번(파이썬): 효율적인 해킹

JunJangE 2021. 7. 28. 12:31

문제

 

1325번: 효율적인 해킹

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

www.acmicpc.net

- 해커 김지민은 잘 알려진 어느 회사를 해킹하려고 한다.

- 이 회사는 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

 

GitHub - junjange/CodingTest: 내가 푼 코딩 테스트 문제와 해결법

내가 푼 코딩 테스트 문제와 해결법. Contribute to junjange/CodingTest development by creating an account on GitHub.

github.com