상세 컨텐츠

본문 제목

파이썬으로 풀어보는 백준 2660번: 회장뽑기

Python/문제풀이

by 코딩하는 낙타 2020. 2. 2. 23:37

본문

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

 

2660번: 회장뽑기

입력의 첫째 줄에는 회원의 수가 있다. 단, 회원의 수는 50명을 넘지 않는다. 둘째 줄 이후로는 한 줄에 두 개의 회원번호가 있는데, 이것은 두 회원이 서로 친구임을 나타낸다. 회원번호는 1부터 회원의 수만큼 붙어 있다. 마지막 줄에는 -1이 두 개 들어있다.

www.acmicpc.net

 

내 풀이:

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
def check(i, j):
    queue = [i]
    checking = []
    cnt = 0
    table = [1]
    while queue:
        a = queue.pop(0)
        if field[a][j] == 1:
            break
        else:
            checking.append(a)
            for num, i in enumerate(field[a]):
                if i == 1 and num not in checking:
                    queue.append(num)
                    table.append(table[cnt]+1)
            cnt += 1
    return table[cnt]
 
= int(input())
field = [[0* (N+1for _ in range(N+1)]
result = [[0* (N+1for _ in range(N+1)]
 
while True:
    a, b = map(int,input().split())
    if a == -1:
        break
    field[a][b] = 1
    field[b][a] = 1
 
 
score = [0* (N+1)
score[0= 100
 
for i in range(1, N+1):
    for j in range(1, N+1):
        if i == j or result [i][j] != 0:
            pass
        else:
            value = check(i, j)
            result[i][j] = value
            result[j][i] = value
for i in range(1, N+1):
    score[i] = max(result[i])
 
cut = min(score)
lst = []
for idx, i in enumerate(score):
    if i == cut:
        lst.append(idx)
 
print(cut, len(lst))
print(" ".join([str(i) for i in lst]))
 

Python3, 128ms

BFS를 이용하여 문제를 해결하였다. BFS를 거의 처음 사용하다 보니 지금 검토하는 자료가 어느 깊이의 자료인지 정해주는 방법을 모르겠어서 이를 체크해주는 체크 리스트를 따로 만들어야만 했다. 다른 사람들도 깊이를 표현하기 위해 리스트를 새로 만드는지 아니면 다른 방법이 있는지 잘 모르겠다.

 

newprog님의 풀이:

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
import sys
 
= int(input())
= [[0 for _ in range(n+1)] for _ in range(n+1)]
 
while True:
    t = list(map(int, sys.stdin.readline().split()))
    if t[0== -1:
        break
    a[t[0]][t[1]] = 1
    a[t[1]][t[0]] = 1
 
def find(idx):
    s = {idx}
    q = [(idx, 0)]
    m = 0
    while len(q) != 0:
        p, d = q.pop(0)
        m = d
        for i, e in enumerate(a[p]):
            if e == 1 and i not in s:
                q.append((i, d+1))
                s.add(i)
    return m
 
score_dic = dict()
for i in range(1,n+1):
    score_dic[i] = find(i)
sort = sorted(score_dic.items(), key=lambda x: x[1])
count = n
can = ""
for i, e in enumerate(sort):
    if e[1!= sort[0][1]:
        count = i
        break
    else:
        can += str(e[0]) + " "
print(sort[0][1], count)
print(can.strip())
 

Python3, 56ms

 

앞서 언급한 깊이가 stack이라는 개념인 것 같다. 이에 관한 공부는 다음에 이어나갈 계획이다.

관련글 더보기

댓글 영역