제가 그래프에 많이 약해서 그래프 좀 풀어보겠습니다.
https://school.programmers.co.kr/learn/courses/30/lessons/43162
네트워크
2차원 배열이 있고, 각 열마다 어떤 번호와 연결되어 있는지 1, 연결되어 있지 않은지 0으로 표시합니다.
A-B, B-C 연결에서 A와 C는 B를 통해 간접적으로 연결됩니다.
이런 간접 연결을 포함해서 같은 네트워크 상에 있는 컴퓨터의 최대 개수를 구합니다
BFS 기본 구조는
from collections import deque로 deque를 불러오고
일단 q에 첫 번째 원소를 집어넣고
while q를 돌려서 q가 빌떄까지 계속한다
그 안에서 for문을 돌려 q에서 popleft 한 원소에 대해
그 원소 주변에 있는 조건에 해당하는 원소를 살피고
조건에 해당하면 q에 추가한다.
위 구조가 bfs 함수의 구조이고,
main 함수에서 for문으로 bfs 문을 탐색한다
이 구조가 항상 헷갈리는데
일단 bfs 함수 따로 만들고
main 함수에서 bfs 함수를 불러와서 실행하는 방식으로 이해하면 된다고 생각한다
디테일은 풀면서 계속 잡아나가자
from collections import deque
def solution(n, computers):
def bfs(start):
q = deque([start])
visited[start]=True
while q:
node = q.popleft()
for neighbor in range(n):
if computers[node][neighbor]==1 and not visited[neighbor]:
visited[neighbor] = True
q.append(neighbor)
visited = [False]*n
answer=0
for i in range(n):
if not visited[i]:
bfs(i)
answer+=1
return answer
컴퓨터는 n개, 각 컴퓨터를 순차적으로 탐색하며 bfs를 돌려준다
이때 2차원 배열은 A,B 두 컴퓨터에 대해 (A,B) 또는 (B,A)의 연결관계를 모두 가지고 있어서
같은 연결을 두 번 탐색해 네트워크 길이 측정에 오류를 범할 수 있기 때문에!
visited 배열에서 이미 방문한 컴퓨터가 아닌 경우에만 bfs 함수를 돌린다.
---
bfs는 각 컴퓨터 번호를 q에 첫번째 원소로 넣어 탐색을 시작한다
q.popleft() (큐에 가장 먼저 삽입된 원소)를 기준으로, 해당 원소의 이웃들을 점검한다
만약 해당 원소가 어떤 이웃과 연결되어 값이 1이고, 방문한적이 없다면
- 방문했다고 True로 갱신, 그리고 해당 원소를 q에 추가한다
위 세 줄을 반복해서 q에 더이상 추가될 원소가 없으면 while문은 종료된다
---
다시 main의 for문 안으로 돌아와서 answer를 1 증가시킨다
또 다시 다음 컴퓨터 번호에 대해 for문이 시작된다.
---
for문이 끝나면 answer를 return한다
---
티스토리 블챌이 시작되었는데
21일 동안 꾸준히 해야하는 만큼...
꾸준히 풀어야 하는 코테로 해보겠습니다..
그 사이사이 늘 올리던 대로 컴파일러 정리도 올라갈 예정
근데 나 프엔 백엔 글감은 밀려있는데 정작 못올리고 있다...
'개발자 강화 > 코딩 테스트' 카테고리의 다른 글
[백준] 18352-특정 거리의 도시 찾기 BFS (Python3) (0) | 2024.11.08 |
---|---|
[백준] 1926_그림 BFS 실1 (Python3) (3) | 2024.11.07 |
[프로그래머스] 카펫 - 완전탐색 (C++) lv2 (0) | 2024.11.06 |
[프로그래머스] 소수 찾기 - 완전탐색 (C++) (0) | 2024.11.06 |
[프로그래머스] 최소직사각형 - 완전탐색 (c++) (0) | 2024.11.06 |