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

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

페이지 맨 위로 올라가기

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

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

[골드 3] 백준 12784 - 인하니카 공화국 (파이썬)

  • 2025.07.04 14:12
  • Programming/백준
글 작성자: pental

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

풀이

  • 인하니카 공화국의 수도는 1번 정점(문제에서는 0번으로 인덱싱)이다.
  • 나머지 모든 정점은 루팡에 의해 공격받을 수 있고, 이들을 방어하기 위해 일부 간선에 폭탄을 설치해야 한다.
  • 폭탄은 정점에 도달하는 가장 짧은 경로에 설치되고, 그 간선의 최소 비용이 사용된다.
  • 최소한의 비용으로 모든 리프 노드를 보호하려고 할 때, 그 비용을 구하는 문제다.
  1. 입력 및 그래프를 구성한다.
N, M = map(int, input().split())
adj = [[] for _ in range(N)]

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

adj[u] = [(v, w), …] 을 인접리스트 형식 그래프로 구성하는데 0-Based indexing으로 처리한다.

  1. DFS + DP 를 구성한다.
visit = [False] * N
D = [0] * N

visit은 방문 체크용이며, D[u]는 정점 u를 루트로 하는 서브트리에서 리프를 방어하기 위한 최소 비용이다.

  1. DFS 함수를 구현한다.
def dfs(u) :
    visit[u] = True

    is_leaf = True
    for v, w in adj[u] :
        if not visit[v] :
            dfs(v)
            D[u] += min(w, D[v])
            is_leaf = False
    
    if u != 0 and is_leaf :
        D[u] = 1e9

모든 자식 노드에 대해서 dfs를 수행한뒤, 해당 간선의 가중치와 D[v] 중 더 작은 값을 더한다.
즉, 간선에 폭탄을 설치할 지, 자식 쪽에서 더 싸게 설치하는 게 나을지 비교한다.
is_leaf가 True라는건 리프 노드라는 뜻이고, 리프 노드는 테러범의 공격 대상이므로 D[u] = 1e9로 설정해 최대한 큰 값으로 강제적으로 설치를 유도한다.

dfs(0)
print(D[0])

루트에서 시작해 트리를 돌고, D[0]에는 전체 최소 비용이 저장된다.

코드

# 백준 12784 - 인하니카 공화국
# 분류 : 다이나믹 프로그래밍

T = int(input())
for _ in range(T) :
    N, M = map(int, input().split())
    adj = [[] for _ in range(N)]

    for _ in range(M) :
        a, b, c = map(int, input().split())
        a -= 1
        b -= 1
        adj[a].append((b, c))
        adj[b].append((a, c))
    
    visit = [False] * N
    D = [0] * N

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

        is_leaf = True
        for v, w in adj[u] :
            if not visit[v] :
                dfs(v)
                D[u] += min(w, D[v])
                is_leaf = False
        
        if u != 0 and is_leaf :
            D[u] = 1e9
    
    dfs(0)
    print(D[0])
저작자표시 비영리 (새창열림)

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

[골드 2] 백준 2749 - 피보나치 수 3 (파이썬)  (0) 2025.07.04
[플래티넘 5] 백준 20188 - 등산 마니아 (파이썬)  (0) 2025.07.03
[실버 2] 백준 17213 - 과일 서리 (파이썬)  (0) 2025.07.03
[골드 2] 백준 1655 - 가운데를 말해요 (파이썬)  (0) 2025.07.02
[골드 4] 백준 1327 - 소트 게임 (파이썬)  (0) 2025.07.02

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [골드 2] 백준 2749 - 피보나치 수 3 (파이썬)

    [골드 2] 백준 2749 - 피보나치 수 3 (파이썬)

    2025.07.04
  • [플래티넘 5] 백준 20188 - 등산 마니아 (파이썬)

    [플래티넘 5] 백준 20188 - 등산 마니아 (파이썬)

    2025.07.03
  • [실버 2] 백준 17213 - 과일 서리 (파이썬)

    [실버 2] 백준 17213 - 과일 서리 (파이썬)

    2025.07.03
  • [골드 2] 백준 1655 - 가운데를 말해요 (파이썬)

    [골드 2] 백준 1655 - 가운데를 말해요 (파이썬)

    2025.07.02
다른 글 더 둘러보기

정보

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

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

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

검색

메뉴

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

카테고리

  • Category (476) N
    • Forensics (19)
      • Magnet AXIOM (28)
      • Digital Forensics Informati.. (9)
      • Iphone Forensics (25)
      • 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 (284) N
      • C (10)
      • Python (11)
      • 백준 (230) N
      • 프로그래머스 (32)
    • 그냥 개발 및 잡담 (16)
      • Docker (2)
      • Google Cloud (3)
      • OS 개발 (3)
    • Best of Best (20)

최근 글

인기 글

댓글

공지사항

아카이브

태그

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

정보

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

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

pental

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

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

티스토리

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

티스토리툴바