Cometin'

BOJ-2606 - Python

2021-01-28 at Algorithm category

그래프 탐색을 이용한 바이러스 문제를 다시 풀어보았다. 기존 방법인 현재 노드의 방문확인 후 연결된 노드들을 extend하는 방법을 유지하며 그래프의 선언 및 추가 부분을 깔끔하게 바꾼 방법으로 풀었으며 다른 방법은 요즘 주로 사용하는 자식 노드들을 기준으로 반복을 돌며 자식노드들의 방문 확인 후 q에 추가하는 방법이다. 두 방법 중 extend하는 방법이 시간이 백준 상 4ms 차이로 빠른데, 내장 함수 사용에서 나오는 차이갔다. 하지만 extend는 확장성이 떨어지기 때문에 간단한 문제에서만 쓰일 것 같은 내 예상이다.

# def dfs(graph):
#     visit = []
#     stack = [1]
#     while stack:
#         node = stack.pop()
#         if node not in visit:
#             visit.append(node)
#             if node in graph:
#                 stack.extend(graph[node])
#     return visit
#
# graph = {}
# input()
# for _ in range(int(input())):
#     x, y = map(int, input().split())
#     if x in graph:
#         graph[x].append(y)
#     else:
#         graph[x] = [y]
#     if y in graph:
#         graph[y].append(x)
#     else:
#         graph[y] = [x]
#
# print(len(dfs(graph))-1)

# def solve():
#     visit = [False for _ in range(n+1)]
#     visit[1] = True
#     q = [1]
#     ans = 0
#
#     while q:
#         node = q.pop()
#         for next_node in graph[node]:
#             if not visit[next_node]:
#                 visit[next_node] = True
#                 q.append(next_node)
#                 ans += 1
#     return ans
#
# n = int(input())
# m = int(input())
# graph = {i: [] for i in range(1, n+1)}
#
# for _ in range(m):
#     s, e = map(int, input().split())
#     graph[s].append(e)
#     graph[e].append(s)
# print(solve())

def solve():
    visit = [False for _ in range(n+1)]
    q = [1]

    while q:
        node = q.pop()
        if not visit[node]:
            visit[node] = True
            q.extend(graph[node])

    return visit.count(True) - 1

n = int(input())
m = int(input())
graph = {i: [] for i in range(1, n+1)}

for _ in range(m):
    s, e = map(int, input().split())
    graph[s].append(e)
    graph[e].append(s)

print(solve())

hyesungoh

Personal blog by hyesungoh.

I like to share my knowledge for those who wandering in issue.