일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 프로그래머스
- nestjs auth
- C언어
- 카카오 알고리즘
- @Component
- thymeleaf
- 가상면접사례로배우는대규모시스템설계기초
- 알고리즘
- nestjs typeorm
- OpenCV
- python
- git
- spring boot
- Spring
- 스프링
- 시스템호출
- 파이썬
- TypeORM
- @Autowired
- 코테
- 코딩테스트
- 카카오 코테
- AWS
- 카카오
- C++
- 해시
- nestJS
- 컴포넌트스캔
- Nodejs
- 구조체배열
Archives
- Today
- Total
공부 기록장 💻
[알고리즘/BFS,DFS] 백준 BOJ 2606 바이러스 본문
6. BOJ 2606 바이러스
문제
신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.
예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.
어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.
출력
1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.
예제 입력 1
7
6
1 2
2 3
1 5
5 2
5 6
4 7
예제 출력 1
4
💡나의 문제 풀이
문제 해결 아이디어
- 그래프 생성 후, False 리스트를 만들고 1번을 통해 인접한 노드들을 탐색할 때마다 해당 노드의 리스트 값을 True로 변경
- True의 개수 출력
고려 사항
- 1을 통해 연결된 네트워크 상의 모든 컴퓨터를 출력해야 하므로, 1번은 제외하고 출력한다.
작성 코드
def dfs(graph, v, visited):
# 현재 노드 방문 처리
visited[v] = True
for i in graph[v]:
if visited[i]==False:
dfs(graph, i, visited)
n = int(input()) # 컴퓨터 수
m = int(input()) # 간선 개수
graph = [[] for _ in range(n+1)]
for i in range(m):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
# 1번부터 인접한 노드들을 탐색하며
visited = [False]*(n+1)
dfs(graph, 1, visited)
cnt = 0
for i in visited:
if i==True: # 1과 연결된 네트워크상의 모든 노드들
cnt += 1
print(cnt-1) # 1 제외
답안 코드
- 마지막 출력을 sum 함수를 이용할 수도 있다.
- print(sum(visited)-1)
- visited[] 리스트를 사용하지 않고 global 변수를 사용해서 cnt 값을 증가시키는 방법도 있다.
- cnt = 0 visited = [0]*(n+1) def dfs(start): global cnt visited[start] = 1 for i in graph[start]: if visited[i]==0: dfs(i) cnt +=1 dfs(1) print(cnt)
리뷰
- 기본적인 dfs만 이해하면 쉽게 풀수 있었던 문제이다 🙂
728x90
반응형
'# CS Study > Algorithms' 카테고리의 다른 글
[알고리즘/정렬] 백준 BOJ 2108 통계학 (0) | 2022.08.23 |
---|---|
[알고리즘/정렬] 프로그래머스 가장 큰 수 (0) | 2022.08.23 |
[알고리즘/구현] 백준 BOJ 4673 셀프 넘버 (0) | 2022.08.23 |
[알고리즘/그리디] 백준 BOJ 1931 회의실 배정 (0) | 2022.08.23 |
[알고리즘/그리디] 백준 BOJ 10610 30 (0) | 2022.08.23 |
Comments