Post

백준 2617번 python 풀이 - 구슬 찾기

문제 링크

2617번

해결책

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import sys

N, M = map(int, sys.stdin.readline().rstrip().split())

"""
아이디어 정리
A번 구슬보다 무겁거나 가벼운 것이 N//2+1 개 이상이면...!
만약 5개의 구슬이 있다면, A 구슬보다 무겁거나 가벼운 것이 3개 이상인 경우
A 구슬은 절대 중앙이 될 수 없다.
이러한 방식으로 하면 되지 않을까?
"""


def dfs(idx):
    stk = [idx]
    is_visited = [False for _ in range(N + 1)]
    more_cnt = -1
    is_visited[idx] = True
    while stk:
        cur = stk.pop()
        more_cnt += 1
        if more_cnt >= piv:
            return True

        for path in path_heavier[cur]:
            if is_visited[path] is False:
                stk.append(path)
                is_visited[path] = True

    stk = [idx]
    is_visited = [False for _ in range(N + 1)]
    less_cnt = -1
    is_visited[idx] = True
    while stk:
        cur = stk.pop()
        less_cnt += 1

        if less_cnt >= piv:
            return True

        for path in path_lighter[cur]:
            if is_visited[path] is False:
                stk.append(path)
                is_visited[path] = True
    return False


weight = [[0, 0] for i in range(N + 1)]
path_lighter = [[] for i in range(N + 1)]
path_heavier = [[] for i in range(N + 1)]
piv = N // 2 + 1
ans = 0

for _ in range(M):
    more, less = map(int, sys.stdin.readline().rstrip().split())
    if more not in path_heavier[less]:
        path_heavier[less].append(more)
    if less not in path_lighter[more]:
        path_lighter[more].append(less)

for num in range(1, N + 1):
    if (dfs(num)):
        ans += 1

print(ans)

주석으로 달 설명

DFS로 풀었다. 양방향으로 각각 DFS를 이용해서 완전탐색을 통해, 특정 노드보다 큰 전체를 탐색, 갯수 파악을 진행하였다.

This post is licensed under CC BY 4.0 by the author.