마음만 바쁜 사람
Published 2022. 4. 25. 23:12
1058-친구 ALGORITHM/BOJ

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

 

1058번: 친구

지민이는 세계에서 가장 유명한 사람이 누구인지 궁금해졌다. 가장 유명한 사람을 구하는 방법은 각 사람의 2-친구를 구하면 된다. 어떤 사람 A가 또다른 사람 B의 2-친구가 되기 위해선, 두 사람

www.acmicpc.net

그래프 탐색 문제이다. 처음에는 아무 생각 없이 DFS 방식으로 접근했는데, 문제의 조건을 보니 BFS로 푸는게 가장 옳은 방법인것 같다. 자신의 기준으로 최대 2단계 레벨에 해당하는 친구들의 수를 세서 비교하는 문제라 한쪽으로 끝까지 파고 들어가는 DFS보단 레벨별로 훑어나가는 BFS의 방식이 딱 알맞다.

 

코드 구성은 BFS에서 최대 2번째 레벨까지만 탐색을 진행하고 카운트를 비교하는 방식. bfs = queue 사용의 공식에 따라 큐를 놓고(코드에선 deque) 탐색을 진행한다.

초기에 주어지는 인접행렬을 받을때 문자열의 형태로 받게 되는데 sys.stdin.readline의 경우 개행문자(\n)까지 받게 되어 이를 제거해 주어야 한다. 입력함수 뒤에 .strip()을 추가하면 된다.

import sys
from collections import deque
input = sys.stdin.readline
N = int(input())
adj = []
for _ in range(N):
    adj.append(list(input().strip()))	# 개행문자 제거

def bfs(start, line):		# 시작위치와 현재 레벨을 입력받는다.
    dq = deque()
    dq.append((start,line))
    chk[start] = 1
    while dq:
        now, nowline = dq.popleft()        
        if nowline == 2:		# 깊이가 2이면 멈춘다.
            continue
        for nxt in range(N):
            if adj[now][nxt] == 'Y' and chk[nxt] == 0:
                chk[nxt] = 1
                dq.append((nxt,nowline+1))

ans = 0
for i in range(N):
    chk = [0] * N
    bfs(i,0)
    ans = max(ans, sum(chk)-1)

print(ans)

'ALGORITHM > BOJ' 카테고리의 다른 글

16946-벽 부수고 이동하기 4  (0) 2022.04.26
2178-미로탐색  (0) 2022.04.26
11724-연결 요소의 개수  (0) 2022.04.25
1302-베스트셀러  (0) 2022.04.22
11286- 절댓값 힙  (0) 2022.04.22
profile

마음만 바쁜 사람

@훌루훌루

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!