프로그래머스 네트워크 파이썬
문제 설명
네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다.
컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오.
제한 사항
컴퓨터의 개수 n은 1 이상 200 이하인 자연수입니다.
각 컴퓨터는 0부터 n-1인 정수로 표현합니다.
i번 컴퓨터와 j번 컴퓨터가 연결되어 있으면 computers[i][j]를 1로 표현합니다.
computer[i][i]는 항상 1입니다.
해결 전략
문제 상황을 잘 뜯어보면 서로소 집합의 개수를 구하는 문제임을 알 수 있었다.
그래서 유니온 파인드 알고리즘을 이용해서 풀려고 시도 했다.
하지만 이 문제에서는 예외 상황이 생길 수 있는데 배열을 다 돌면서 서로소 집합을 만들었을 때
연결되는 순서에 따라서 union 했을 때 부모가 제대로 안잡힐 수 있다는 점이었다.
나는 이 부분에 대한 입력을 못 찾아내서 질문하기에 있는 테스트 케이스를 찾았다.
이 부분에 대한 해결 방안은 마지막으로 parent 배열을 i번째의 부모를 찾아서 넣어주면 해결 할 수 있다.
보완
테스트 케이스가 복잡할 때 예제를 만드는게 어려운 거 같다.
어떻게 예외가 날 만한 예제를 만들어서 넣을 수 있을까는 문제를 많이 풀어 보면서 계속 예제를 만드는 연습을 해 보아야 할 거 같다.
또한 이 문제를 풀면서 union find알고리즘을 안보고 구현하려 했으나 union부분을 구현하는데 실패해서 결국 구글링한 union find 알고리즘을 이용해서 문제를 풀었다
union find 알고리즘은 다시 블로그에 정리해서 올려야겠다.
코드
def solution(n, computers):
answer = 0
parent = [i for i in range(n)]
def find(target):
if target == parent[target]:
return target
parent[target] = find(parent[target])
return parent[target]
def union(a, b):
a = find(a)
b = find(b)
if a < b:
parent[b] = a
else:
parent[a] = b
#배열을 싹다 돌면서 연결되어 있는 경우 부모를 찾아낸다.
for i in range(n):
for j in range(n):
if computers[i][j] == 0:
continue
union(i, j)
#예외처리
for i in range(n):
parent[i] = find(i)
answer = len(set(parent))
return answer
Author And Source
이 문제에 관하여(프로그래머스 네트워크 파이썬), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@kimjungmini0601/프로그래머스-네트워크-파이썬
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
def solution(n, computers):
answer = 0
parent = [i for i in range(n)]
def find(target):
if target == parent[target]:
return target
parent[target] = find(parent[target])
return parent[target]
def union(a, b):
a = find(a)
b = find(b)
if a < b:
parent[b] = a
else:
parent[a] = b
#배열을 싹다 돌면서 연결되어 있는 경우 부모를 찾아낸다.
for i in range(n):
for j in range(n):
if computers[i][j] == 0:
continue
union(i, j)
#예외처리
for i in range(n):
parent[i] = find(i)
answer = len(set(parent))
return answer
Author And Source
이 문제에 관하여(프로그래머스 네트워크 파이썬), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kimjungmini0601/프로그래머스-네트워크-파이썬저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)