[백준/BOJ] 1149 RGB거리 - JAVA - 실버1

2025. 5. 4. 01:51·알고리즘/문제풀이
728x90
반응형

[백준/BOJ] 1149 RGB거리 - JAVA - 실버1

문제

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

문제 분석

조건

  • N개의 집이 일렬로 있다.
  • 각 집은 빨강, 초록, 파랑 중 하나로 칠해야 한다.
  • 서로 인접한 두 집은 같은 색으로 칠할 수 없다.
  • 모든 집을 칠하는 비용이 주어질 때, 전체 최소 비용을 구하는 문제이다.

풀이방법

  • i번째 집을 칠할 때는, 바로 앞 집과 같은 색을 사용할 수 없다는 제약이 존재한다.
  • 따라서 i번째 집을 빨강으로 칠한다면, i-1번째 집은 초록이나 파랑으로 칠해야 한다.
  • 이 원리를 바탕으로, 현재 집을 어떤 색으로 칠할지를 결정할 때는 이전 집에서 가능한 두 가지 색 중 더 적은 비용을 선택하여 누적해나가는 방식으로 최소 비용을 구할 수 있다.
  • 점화식에 따라 각 집을 어떤 색으로 칠할지를 결정하면서, 조건을 만족하는 누적 최소 비용을 구해나간다.
  • 마지막 집까지 계산을 마친 후, 세 가지 색 중 최소값을 선택하면 전체 집을 칠하는 데 드는 최소 비용을 얻을 수 있다.
  • 이를 기반으로 dp[color][i]는 i번째 집을 color로 칠했을 때의 누적 최소 비용을 의미하며, 점화식은 다음과 같이 정의된다.
dp[RED][i] = min(dp[GREEN][i-1], dp[BLUE][i-1]) + cost[RED][i] 
dp[GREEN][i] = min(dp[RED][i-1], dp[BLUE][i-1]) + cost[GREEN][i] 
dp[BLUE][i] = min(dp[RED][i-1], dp[GREEN][i-1]) + cost[BLUE][i]

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(br.readLine());
        int[][] cost = new int[3][N];

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int color = 0; color < 3; color++) {
                cost[color][i] = Integer.parseInt(st.nextToken());
            }
        }
        int[][] dp = new int[3][N];
        int red = 0;
        int green = 1;
        int blue = 2;
        dp[red][0] = cost[red][0];
        dp[green][0] = cost[green][0];
        dp[blue][0] = cost[blue][0];
        for (int i = 1; i < N; i++) {
            dp[red][i] = Math.min(dp[green][i - 1], dp[blue][i - 1]) + cost[red][i];
            dp[green][i] = Math.min(dp[red][i - 1], dp[blue][i - 1]) + cost[green][i];
            dp[blue][i] = Math.min(dp[green][i - 1], dp[red][i - 1]) + cost[blue][i];
        }
        System.out.println(Math.min(Math.min(dp[red][N - 1], dp[blue][N - 1]), dp[green][N - 1]));
    }
}

결과

728x90
반응형
저작자표시 비영리 변경금지
'알고리즘/문제풀이' 카테고리의 다른 글
  • [프로그래머스] 86971 전력망을 둘로 나누기 - JAVA - Lv2
  • [백준/BOJ] 1240 노드사이의 거리 - JAVA - 골드5
  • [백준/BOJ] 12946 하노이의 탑 - JAVA - Lv2
  • [프로그래머스] 92343 양과 늑대 - JAVA - Lv3
LIRI
LIRI
  • LIRI
    기록
    LIRI
  • 전체
    오늘
    어제
    • 분류 전체보기 (42) N
      • 블로그 꾸미기 (0)
      • Spring (6)
      • React (3)
      • CS (0)
      • 알고리즘 (26) N
        • 개념 (2)
        • 문제풀이 (23) N
      • Java (1)
      • DB (1)
      • log (4)
        • SSAFY (3)
        • 궁금 (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    골드1
    프로그래머스
    리액트
    불 끄기
    SSAFY 스터디
    dfs
    JWT
    pccp모의고사
    그리디
    lv3
    LIS
    SSAFY
    Spring
    최장증가부분수열
    백준
    알고리즘
    BFS
    싸피
    Java
    dp
    BOJ
    springboot
    ssafy 합격 후기
    LV2
    도대체왜
    SSAFY 9기
    Springsecurity
    Security
    너비우선탐색
    비트마스킹
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
LIRI
[백준/BOJ] 1149 RGB거리 - JAVA - 실버1
상단으로

티스토리툴바