https://www.acmicpc.net/problem/5567
Solved
import sys
from collections import deque
input = sys.stdin.readline
N = int(input()) # 2 ~ 500
M = int(input()) # 1 ~ 10000
adj = [[0 for _ in range(N+1)] for _ in range(N+1)]
for _ in range(M):
a, b = map(int, input().rstrip().split())
adj[a][b] = adj[b][a] = 1
visited = [False for _ in range(N+1)] # 1번: 상근, 2~N: 친구들
ans = 0
def bfs(cur_v):
global ans
dq = deque([(cur_v, 0)]) # 노드, depth(직속친구 : 1, 친구의 친구 : 2)
while dq:
cur_v, depth = dq.popleft()
for i in range(1, N+1):
if adj[cur_v][i] == 1 and not visited[i] and depth < 2:
dq.append((i, depth + 1))
visited[i] = True
adj[cur_v][i] = 0
ans += 1
bfs(1)
print(ans-1 if ans else 0) # 상근 본인 빼고
BFS로 풀이한 문제다.
M개의 줄에 걸쳐 입력받은 그래프 정보를 인접행렬로 만듦
deque에 인자로 들어온 현재 노드를 넣어줄 때,
위의 조건을 고려해주기 위해 (노드, depth=0)
의 튜플 형태로 넣어줌
dq의 cur_v
노드 순회 조건
현재 노드의 이웃한 노드인지 (adj[cur_v][i] == 1
)
방문한 적 없는 노드인지 (not visited[i]
)
현재 노드와의 depth가 2 미만인지
→ 2 이상이면 친구의 친구 관계를 넘어 상근이와 모르는 관계가 됨
위 3조건 만족 시,
ans값이 상근이를 포함해 갱신되므로, ans > 0 인 경우 ans-1을 리턴해줌
BFS에서 요구하는 정답 갱신하는 부분 잘 생각하기!