itisjustK
코딩과 사람 사는 이야기
itisjustK
전체 방문자
오늘
어제
  • 분류 전체보기 (207)
    • 일이삼사오육칠팔구십일이삼사오육칠팔구십일이삼사오육칠.. (0)
    • Web (43)
      • html & css (9)
      • django & python (15)
      • java script (9)
    • iOS (51)
      • Swift (42)
      • SwiftUI (5)
    • CS (25)
      • 자료구조 (6)
      • 운영체제 (3)
      • 데이터베이스 (9)
      • 네트워크 (7)
    • PS (34)
      • 알고리즘 & 자료구조 (0)
    • Life (36)
    • Retrospective (15)
    • Book (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 생활코딩
  • CoreData
  • nosql
  • SWIFT
  • 연결리스트
  • 독립서점
  • SwiftUI
  • 킨디
  • binding
  • 개발자
  • mongodb
  • 세그멘테이션
  • AppleDevloperAcademy
  • crud
  • POSTECH
  • 어플
  • ios
  • 점주
  • CS
  • 생활코딩 #이고잉 #HTML #코딩 #개발자

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
itisjustK

코딩과 사람 사는 이야기

7주차 [백준 2606 - 바이러스]
PS

7주차 [백준 2606 - 바이러스]

2021. 8. 5. 17:50
신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.

어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.

*입력
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.

*출력
1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.

내 풀이

n=int(input())
m=int(input())
graph= [[0]*(n+1) for _ in range(n+1)]
for _ in range(m):
    m1, m2=map(int,input().split())
    graph[m1][m2] = graph[m2][m1] = 1

visited=[]
def dfs(v):
    visited.append(v)
    for i in range(len(graph[v])):  #0,1,2,3,4,5,6,7
        if graph[v][i] == 1 and i not in visited:
            dfs(i)

dfs(1)
print(len(visited)-1)

 

  • 연결되어 있는 모든 컴퓨터 탐색 -> dfs 
  • 연결 관계 표시 방법 -> 행렬

 

※ 행렬 코드 차이 (for문으로 이중리스트 선언 vs 단순 연산으로 이중리스트 선언)

더보기
graph1 = [[0]*(4) for _ in range(4)]
graph2 = [[0]*(4)]*(4)

graph1[1][1] = 1
graph2[1][1] = 1

print(graph1)
#[[0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

print(graph2)
#[[0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0]]

내가 의도한 건 print(graph1) 의 모습이었지만 graph 코드를 작성할 때 graph2처럼 작성하였다.

그래서 결과가 다르게 나왔다. 왜 graph2처럼 하고 행렬 원소를 넣을 때 모든 행에 대해서 결과가 바뀔까?

 

연산자 *로 배열을 선언하면 얕은복사가 일어나서 바라보는 객체는 동일하기 때문이다.

for문으로 이중 리스트를 선언한 것과 결과는 같겠지만, 단순히 요소를 복사하는 얕은복사에 불과하다. 단순히 요소를 복사하다 보니 바라보는 객체를 동일하다. 즉, 이러한 방식으로 선언 뒤에, 값을 변경하게 되면 다른 원소들도 값이 변경되는 현상이 발생하게 되므로 이를 인지하고, 후에 대입연산자를 통해 값을 변경하지 않는 경우에만 사용하는 것이 좋다.

 

저작자표시 (새창열림)

'PS' 카테고리의 다른 글

[ 백준 2178 - 미로탐색 ] - bf  (0) 2021.08.06
7주차 [ 음료수 얼려 먹기 ]  (0) 2021.08.06
DFS와 BFS  (0) 2021.08.04
6주차 [ 프로그래머스 - 카카오 다트게임 ]  (0) 2021.07.30
6주차 [ 프로그래머스 - 완주하지 못한 선수 ] zip  (0) 2021.07.28
    'PS' 카테고리의 다른 글
    • [ 백준 2178 - 미로탐색 ] - bf
    • 7주차 [ 음료수 얼려 먹기 ]
    • DFS와 BFS
    • 6주차 [ 프로그래머스 - 카카오 다트게임 ]
    itisjustK
    itisjustK

    티스토리툴바