네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 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입니다.
문제풀이
def solution(n, computers):
answer =0
c=[i for i inrange(n)]
connect=set()
# 인덱스가 연결된 컴퓨터 숫자들... 이미 줬으니까 이걸 이용하여 풀 수 있을 거 같은데
for i inrange(n):
for j inrange(n):
if computers[i][j]==1and (i,j) notinconnectand (j,i) notinconnect:
if c[i]==c[j]: continue
c[j]=i
connect.add((i,j))
connect.add((j,i))
answer=len(set(c))
return answer
여기서 어제 풀었던 섬 연결하기 코드를 참고하면서 풀어봤는데 답이 안나온다.
def solution(n, computers):
answer =0
c=[i for i inrange(n)]
# connect=set()
# 인덱스가 연결된 컴퓨터 숫자들... 이미 줬으니까 이걸 이용하여 풀 수 있을 거 같은데
# 연결된 값들을 옮김... 그래서 간접적으로 연결된 것들도 같은 곳에 있다는 걸 표시해야함.
connect=[[i] for i inrange(n)]
for i inrange(0,n//2):
for j inrange(n//2,n):
if computers[i][j]==1:
i=c[i]
j=c[j]
if i==j: continue
c[j]=i
while connect[j]:
q=connect[j].pop()
connect[i].append(q)
answer=len(set(c))
return answer
직접 연결뿐만 아니라 간접 연결까지 반영하기 위해 for k in range(n)이 필요함
나의코드
def solution(n, computers):
answer =0
c=[i for i inrange(n)] # 각 노드의 대표값 저장
# connect=set()
# 인덱스가 연결된 컴퓨터 숫자들... 이미 줬으니까 이걸 이용하여 풀 수 있을 거 같은데
# 연결된 값들을 옮김... 그래서 간접적으로 연결된 것들도 같은 곳에 있다는 걸 표시해야함.
connect=[[i] for i inrange(n)] # 연결된 노드 리스트
for i inrange(n):
for j inrange(n):
if computers[i][j]==1and c[i] != c[j]: # 대표값이 다르면
old,new=c[j],c[i] # old: 변경될 값, new: 유지될 값
for k inrange(n): # 전체 배열을 돌면서 old 값을 new로 변경
if c[k]==old:
c[k]=new
answer=len(set(c))
return answer
def solution(n, computers):
visited = [False] * n # 방문 여부 체크
def dfs(node):
for i inrange(n):
if computers[node][i] ==1andnot visited[i]: # 연결되어 있고 방문 안 했으면
visited[i] =True
dfs(i)
answer =0for i inrange(n):
if not visited[i]: # 새로운 네트워크 시작점 발견
visited[i] =True
dfs(i)
answer +=1 # 새로운 네트워크 개수 증가
return answer
DFS 활용..
재귀를 이용한 풀이인데...나는 재귀는 좀 어렵다..ㅠㅜ
def solution(n, computers):
answer =0
visited = [0for i inrange(n)]
def dfs(computers, visited, start):
stack = [start]
while stack:
j = stack.pop()
if visited[j] ==0:
visited[j] =1
# for i inrange(len(computers)-1, -1, -1):
for i inrange(0, len(computers)):
if computers[j][i] ==1and visited[i] ==0:
stack.append(i)
i=0
while 0in visited:
if visited[i] ==0:
dfs(computers, visited, i)
answer +=1
i+=1return answer