문제: 71. 네트워크
- 문제가 이해가 안가서 괴로웠다.
-
30분을 고민한 끝에, 알게된 것은 다음과 같다.
-
A와 B가 연결되어 있고 B와 C가 연결되어 있다면, A와 C도 간접적으로 연결되기 때문에, 같은 네트워크 상에 있다고 볼 수 있다.
- 예제를 살펴보자.
[[1,1,0],[1,1,0],[0,0,1]]
과 같은 이차원 리스트가 있다.-
이를 네트워크로 표현하면 위와 같다. 따라서 1,2가 연결된 네트워크 이므로 1개의 네트워크, 3이 독립적이므로 총 2개의 네트워크가 존재한다.
- 다른 예제
[[1,1,0],[1,1,0],[0,0,1]]
과 같은 이차원 리스트가 있다.- 이를 네트워크로 표현하면 위와 같다. 1,2,3이 모두 연결되어 있으므로 한 개의 네트워크가 존재한다.
풀이방법
- DFS로 풀어야 한다고 한다.
- DFS 순서 -> 초기 스택 비어있으므로 시작 노드 넣고
- 스택에서 노드 하나 꺼내서, 꺼낸 노드의 child 노드를 전부 스택에 (한번 스택에 담았던 노드는 다시 넣지 않는다.)
- 꺼낸 노드는 출력. 이를 반복
def Network(computers, visited, StartNode):
stack = [StartNode] # 스택에 idx 하나 넣고 시작
while stack: # 스택이 빌 때가지
path = stack.pop() # 꺼내고
if not visited[path]: # 방문하지 않았다면
visited[path] = True
for i in range(len(computers)):
if computers[path][i] == 1 and not visited[i]:
stack.append(i)
def solution(n, computers):
answer = 0
visited = [False for _ in range(n)] # 방문했음을 표시
idx = 0
while not all(visited): # 모든 노드가 True가 될 때까지
if not visited[idx]:
Network(computers, visited, idx)
answer += 1
idx += 1
return answer
알게된 것
-
2치원 배열 탐색할 때, for문으로 1차원씩 잘라서 재귀함수 호출 가능
- python 내장 함수 중에 all이란게 있다.
- all(x) : 반복가능한 자료형 x를 입력 인수로 받아 x가 모두 참이면 True, 거짓이면 False를 돌려준다.
참고자료 [프로그래머스]https://programmers.co.kr/learn/challenges [참고블로그]https://codedrive.tistory.com/159?category=809488 [DFS,BFS]https://www.youtube.com/watch?v=_hxFgg7TLZQ&t=91s