Algorithm
[SWEA] 1238. contact - 파이썬
우주알
2023. 2. 26. 15:19
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15B1cKAKwCFAYD
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
- 인접한 노드로 뻗어나가는 구조이므로, 너비우선 탐색(bfs)를 이용한다
- 사람이 최대 100명까지 있다고 해서, 사람번호를 인덱스로 하고, 그 사람이 연락을 받았을 때의 시작사람과의 거리가 얼마인지를 저장해두는 리스트를 만들고 시작했다.(contacted 변수에 할당. 거리를 저장해두는 용도와 이미 연락했는지 확인하는 두가지 용도로 사용)
- 가장 마지막에 연락을 받는 사람이 여러명일 수 있으므로, 노드를 이동할때 마다 시작노드와의 거리를 저장해두고, 최대 거리를 가진 사람들끼리 비교해서 출력해야 한다.
제출코드
for tc in range(1,11):
N,S = map(int,input().split())
lst = list(map(int,input().split()))
adj = [[] for _ in range(101)] # 인접 리스트(비상연락망) 만들기
for i in range(N//2):
a = lst[i*2]
b = lst[i*2+1]
adj[a].append(b)
contacted = [0 for _ in range(101)] # 이미 연락을 받은 사람들 표시할 곳
contacted[S] = 1 # 시작점은 이미 연락받은 셈이므로 표시
Q = [S]
while Q: # 연락 전인 사람들이 남아 있으면 탐색을 계속해야하므로 반복
now = Q.pop(0)
for next in adj[now]:
if contacted[next] == 0:
contacted[next] = contacted[now] + 1
Q.append(next)
for ans in range(100,-1,-1): # 사람 번호를 뒤부터 순회하며 max값을 만나면 출력 후 break
if contacted[ans] == max(contacted):
print(f'#{tc}',ans)
break
풀이과정