728x90
🤴🏻
https://www.acmicpc.net/problem/2660
2660번: 회장뽑기
입력의 첫째 줄에는 회원의 수가 있다. 단, 회원의 수는 50명을 넘지 않는다. 둘째 줄 이후로는 한 줄에 두 개의 회원번호가 있는데, 이것은 두 회원이 서로 친구임을 나타낸다. 회원번호는 1부터
www.acmicpc.net
내 풀이
from collections import deque
def bfs(s):
visited[s] = True
q = deque()
q.append(s)
while q:
c = q.popleft()
for k in member[c]:
if not visited[k]:
visited[k] = True
score[k] = score[c] + 1
q.append(k)
final_score.append(max(score))
N = int(input())
member = [[] for _ in range(N+1)]
final_score = []
while True:
m1, m2 = map(int, input().split())
if m1 == -1 and m2 == -1:
break
member[m1].append(m2)
member[m2].append(m1)
for i in range(1, N+1):
visited = [False] * (N+1)
score = [0] * (N+1)
bfs(i)
leader_score = min(final_score) # 회장 후보의 점수
print(leader_score, final_score.count(leader_score))
for i in range(len(final_score)):
if final_score[i] == leader_score:
print(i+1, end=' ')
bfs(너비 우선 탐색)으로 풀었다.
코드 설명
member: 회원별로 친구 사이인 회원의 번호들을 저장하는 이차원 리스트.
final_score: 회원별 최종 점수를 저장하는 리스트
member = [[] for _ in range(N+1)]
final_score = []
모든 회원의 점수를 계산한다.
bfs 호출 전, visited(방문한 회원인지 아닌지를 구별하는 리스트)와 score(회원 점수를 저장하는 리스트)를 초기화해 준다.
for i in range(1, N+1):
visited = [False] * (N+1)
score = [0] * (N+1)
bfs(i)
최종 점수(final_score) 중, 가장 작은 점수가 회장 후보의 점수가 된다.
leader_score = min(final_score) # 회장 후보의 점수
print(leader_score, final_score.count(leader_score))
for i in range(len(final_score)):
if final_score[i] == leader_score:
print(i+1, end=' ')
✔️ bfs 함수 내
현재 회원과 친구 사이인 회원들을 모두 검사하며, 아직 방문하지 않은 회원이라면 점수를 증가시킨다.
final_score에는 가장 큰 값(해당 회원의 최종 점수)을 추가한다.
while q:
c = q.popleft()
for k in member[c]:
if not visited[k]:
visited[k] = True
score[k] = score[c] + 1
q.append(k)
final_score.append(max(score))
'코딩테스트' 카테고리의 다른 글
[백준][Python] 13265 색칠하기 (2) | 2024.03.17 |
---|---|
[백준][Python] 1245 농장 관리 (0) | 2024.03.15 |
[백준][Python] 2885 초콜릿 식사 (0) | 2024.03.13 |
[백준][Python] 2589 보물섬 (0) | 2024.03.12 |
[백준][Python] 11728 배열 합치기 (1) | 2024.03.12 |