이 영역을 누르면 첫 페이지로 이동
포렌식 & 개발 이야기 - Forensics & Development 블로그의 첫 페이지로 이동

포렌식 & 개발 이야기 - Forensics & Development

페이지 맨 위로 올라가기

포렌식 & 개발 이야기 - Forensics & Development

Pental - Forensics / iOS / Windows / Android / Kakaotalk / Telegram / Etc

백준 2606 - 바이러스

  • 2025.02.01 20:49
  • Programming/백준
글 작성자: pental

https://www.acmicpc.net/problem/2606

해당 문제는 그래프로도 풀어봤고, 새로운 풀이인 DFS로 풀이를 진행하였다.

N = 컴퓨터의 수, M은 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수

그 이후부턴, 한줄에 한쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.

해당 문제에서 DFS를 적용한 이유는 다음과 같다.

"단순히 그래프로도 풀이를 할수 있지만, DFS 알고리즘을 사용하면 시간복잡도가 O(2M)이 된다.'

먼저 N, M을 입력받고, adj 배열에 각각 컴퓨터를 연결시킨다.

N = int(input())
M = int(input())

adj = [[] for i in range(N)]

for _ in range(M) :
    a, b = list(map(int, input().split()))
    adj[a - 1].append(b - 1)
    adj[b - 1].append(a - 1)

연결의 편의성을 위해서 0부터 시작하는것이 아닌 1부터 시작하도록 각각 인접 배열에 - 1씩을 해줘서 숫자를 맞춘다.

DFS를 위해서 컴퓨터의 갯수만큼 방문을 했는지 안했는지 확인하기 위한 visit 배열을 선언하고, 초기에는 방문하지 않았으므로, False로 채운다.

visit = [False] * N

 

그 이후 실질적으로 문제를 풀기 위한 기본적인 DFS 알고리즘을 구현한다. 

해당 알고리즘의 설명은 다음과 같다.

def dfs(u) :
    visit[u] = True

    for v in adj[u] :
        if not visit[v] :
            dfs(v)

DFS는 먼저 들어온 인자를 바탕으로 방문을 했는지 체크를 한다. 그 이후, 해당 인접배열에 연결된 친구들을 순회하면서, 방문을 하지 않았을 경우에만 다시 DFS 제귀를 진행하는 식으로 하면, 연결된 친구들만 Visit이 True로 변경되게 된다.

초기에 시작위치가 1번으로 주어졌기 때문에 DFS(0)를 통해서 1번부터 시작한다.

dfs(0)

count = 0

for i in range(1, N) :
    if visit[i] :
        count += 1

print(count)

 

결국 1번 컴퓨터에 웜 바이러스가 걸렸을경우, 방문을 한 간선의 갯수만 세면 1번을 통해서 전파된 바이러스의 총 합을 구할수 있다.

 

# 백준 2606 - 바이러스
# 분류 : DFS

N = int(input())
M = int(input())

adj = [[] for i in range(N)]

for _ in range(M) :
    a, b = list(map(int, input().split()))
    adj[a - 1].append(b - 1)
    adj[b - 1].append(a - 1)

visit = [False] * N

# dfs
def dfs(u) :
    visit[u] = True

    for v in adj[u] :
        if not visit[v] :
            dfs(v)

dfs(0)

count = 0

for i in range(1, N) :
    if visit[i] :
        count += 1

print(count)
저작자표시 비영리 (새창열림)

'Programming > 백준' 카테고리의 다른 글

백준 2579 - 계단 오르기 (파이썬)  (0) 2025.02.03
백준 11725 - 트리의 부모 찾기  (0) 2025.02.01
[백준] 4673 - 셀프 넘버 (파이썬 / C++)  (0) 2020.04.09
[백준] 15596 - 정수 N개의 합 (파이썬)  (0) 2020.04.09
[백준] 4344 - 평균은 넘겠지 (파이썬) (C)  (0) 2020.04.09

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 백준 2579 - 계단 오르기 (파이썬)

    백준 2579 - 계단 오르기 (파이썬)

    2025.02.03
  • 백준 11725 - 트리의 부모 찾기

    백준 11725 - 트리의 부모 찾기

    2025.02.01
  • [백준] 4673 - 셀프 넘버 (파이썬 / C++)

    [백준] 4673 - 셀프 넘버 (파이썬 / C++)

    2020.04.09
  • [백준] 15596 - 정수 N개의 합 (파이썬)

    [백준] 15596 - 정수 N개의 합 (파이썬)

    2020.04.09
다른 글 더 둘러보기

정보

포렌식 & 개발 이야기 - Forensics & Development 블로그의 첫 페이지로 이동

포렌식 & 개발 이야기 - Forensics & Development

  • 포렌식 & 개발 이야기 - Forensics & Development의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

카테고리

  • Category (439) N
    • Forensics (104)
      • Magnet AXIOM (28)
      • Digital Forensics Informati.. (9)
      • Iphone Forensics (23)
      • DFC (7)
      • 디지털포렌식전문가2급 자격증 (10)
      • FTK ACE 자격증 (7)
    • 이것저것 (7)
      • Ubuntu (6)
      • 디스코드 봇 (4)
      • Volatility GUI (2)
    • CTF (32)
      • NEWSECU (14)
      • CTF-d (5)
      • Puzzel - Network Forensics (2)
      • Security Traps (2)
      • system32.kr (5)
      • HMCTF (4)
    • Programming (248) N
      • C (10)
      • Python (11)
      • 백준 (194) N
      • 프로그래머스 (32)
    • 그냥 개발 및 잡담 (16)
      • Docker (2)
      • Google Cloud (3)
      • OS 개발 (3)
    • Best of Best (20)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 파이썬
  • 백준
  • pental
  • 디지털포렌식
  • 프로그래머스
  • axiom
  • 포렌식
  • Forensics
  • 전체 보기…

정보

pental의 포렌식 & 개발 이야기 - Forensics & Development

포렌식 & 개발 이야기 - Forensics & Development

pental

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © pental.

티스토리툴바