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

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

페이지 맨 위로 올라가기

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

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

[골드 4] 백준 17404 - RGB거리 2 (파이썬)

  • 2025.06.30 10:19
  • Programming/백준
글 작성자: pental

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

풀이

이 문제는 다이나믹 프로그래밍을 사용해서 최소 비용을 계싼하는 문제이다.

각 집은 R(0), G(1), B(2) 중 하나의 색으로만 칠해야 하며, 이웃한 집은 같은 색이면 안된다.

첫번째 집과 마지막 집도 같은 색이면 안된다.

N개의 집이 있고, 각 집의 각 색상별 비용이 주어진다.

즉, 첫번째 집과 마지막 집이 같은색이면 안된다는 조건 때문에 기존 RGB 거리 문제보다 살짝 까다롭다.

그래서 사용한 전략은 다음과 같다.

  1. 첫번째 집의 색상을 R, G, B 하나로 고정하고 시작한다. 즉 3가지 경우로 나눠서 각각 따로 계산한다.
  2. 그 다음 집부터는 기존 RGB거리처럼 dp[i][j] = i번째 집을 j색으로 칠할 때의 최소 비용을 채워나간다.
  3. 마지막 집에서는 첫번째 집과 같은 색이 오지 않도록 확인한다.

예를 들어 집디 3개일때, 다음과 같은 입력이 있다.

26 40 83
49 60 57
13 89 99

각 줄은 각각 집을 빨강, 초록, 파랑으로 칠하는 비용이다.

for first_color in range(3):  # 0(R), 1(G), 2(B)

첫번째 집의 색상을 하나로 고정해서 세번 반복한다.

예를 들면 첫 집을 R로 고정 → G, B로 고정 → …

dp = [[INF]*3 for _ in range(N)]
dp[0][first_color] = A[0][first_color]

DP테이블을 초기화 한다.

첫번째 집은 first_color로 고정해서 그 비용만 기록하고, 나머지 두 색은 절대 고르지 않게 INF로 설정한다.

for i in range(1, N):
    dp[i][0] = min(dp[i-1][1], dp[i-1][2]) + A[i][0]
    dp[i][1] = min(dp[i-1][0], dp[i-1][2]) + A[i][1]
    dp[i][2] = min(dp[i-1][0], dp[i-1][1]) + A[i][2]

이전 집에서 다른 두 색중 최소 비용을 선택해서, 현재 색을 선택한다.

예를 들어 현재 집을 빨강으로 칠하고 싶으면 이전 집은 초록 / 파랑 중 최소를 택해야 한다.

for last_color in range(3):
    if last_color != first_color:
        answer = min(answer, dp[N-1][last_color])

마지막 집의 색이 첫 집과 같지 않을 때만 답으로 고려하고, dp[N - 1][last_color]은 N - 1번째 집을 특정 색으로 칠한 최소 비용을 나타낸다.

구분 의미

dp[i][j] i번째 집을 j색으로 칠했을 때의 최소 비용
첫 집 색 세 가지 경우로 나눠서 DP 세 번 돌림
마지막 집 색 첫 집 색과 다를 때만 유효한 정답 후보

코드

# 백준 17404 - RGB거리 2
# 분류 : 다이나믹 프로그래밍

import sys
input = sys.stdin.readline

INF = 1e9

N = int(input())
A = [list(map(int, input().split())) for _ in range(N)]

answer = INF

for first in range(3) :
    dp = [[INF] * 3 for _ in range(N)]

    dp[0][first] = A[0][first]

    for i in range(1, N) :
        dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + A[i][0]
        dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + A[i][1]
        dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + A[i][2]

    for last in range(3) :
        if last != first :
            answer = min(answer, dp[N - 1][last])

print(answer)

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

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

[실버 4] 백준 9575 - 행운의 수 (파이썬)  (0) 2025.06.30
[골드 4] 백준 14395 - 4연산 (파이썬)  (0) 2025.06.29
[골드 2] 백준 1507 - 궁금한 민호 (파이썬)  (0) 2025.06.28
[골드 2] 백준 3109 - 빵집 (파이썬)  (0) 2025.06.28
[실버 2] 백준 2790 - F7 (파이썬)  (0) 2025.06.28

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [실버 4] 백준 9575 - 행운의 수 (파이썬)

    [실버 4] 백준 9575 - 행운의 수 (파이썬)

    10:18:14
  • [골드 4] 백준 14395 - 4연산 (파이썬)

    [골드 4] 백준 14395 - 4연산 (파이썬)

    2025.06.29
  • [골드 2] 백준 1507 - 궁금한 민호 (파이썬)

    [골드 2] 백준 1507 - 궁금한 민호 (파이썬)

    2025.06.28
  • [골드 2] 백준 3109 - 빵집 (파이썬)

    [골드 2] 백준 3109 - 빵집 (파이썬)

    2025.06.28
다른 글 더 둘러보기

정보

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

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

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

검색

메뉴

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

카테고리

  • Category (469) N
    • Forensics (106) N
      • Magnet AXIOM (28)
      • Digital Forensics Informati.. (9)
      • Iphone Forensics (25) N
      • 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 (276) N
      • C (10)
      • Python (11)
      • 백준 (222) 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.

티스토리툴바