백준 1149 RGB거리 - JAVA

2025. 1. 28. 17:50·알고리즘/백준

1149 문제 링크


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

 

문제 설명


 

입출력


 

코드


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
32
33
34
35
36
import java.io.*;
import java.util.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int input = Integer.parseInt(br.readLine());
        int[][] cost = new int[input][3];
        for(int i = 0; i < input; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for(int j = 0; j < 3; j++) {
                cost[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        int answer = leastSum(input, cost);
 
        bw.write(String.valueOf(answer));
        bw.flush();
    }
    
    private static int leastSum(int input, int[][] cost) {
        int[][] sum = new int[input][3];
        sum[0] = cost[0];
        
        for(int i = 1; i < input; i++) {
            int[] pres = cost[i];
            sum[i][0] = pres[0] + Math.min(sum[i-1][1], sum[i-1][2]);
            sum[i][1] = pres[1] + Math.min(sum[i-1][0], sum[i-1][2]);
            sum[i][2] = pres[2] + Math.min(sum[i-1][0], sum[i-1][1]);
        }
        
        return Math.min(Math.min(sum[input - 1][0], sum[input - 1][1]), sum[input - 1][2]);
    }
}
Colored by Color Scripter
cs

 

알고리즘 설명


주어진 조건 처럼 인접하는 집의 색은 겹치지 않으면서, 모든 집을 칠하는 최소의 비용을 찾기 위해서 모든 경우의 수를 돌게 된다면,
집의 수가 늘어남에 따라 비효율적인 탐색방법일 수 밖에 없습니다.
 
최소의 비용이 드는 집의 색을 구하기 위해서는, 메모이제이션이 필수입니다. 첫번째 집의 RGB를 제외하고,
두번째 집부터는 전에 칠한 색과 겹치지 않는 두 개의 색 중에서 최소의 비용이 드는 값을 누적하여 더해가야 합니다.
이 설명이 조금 어렵다면 아래 예제 1 그림을 참고하면 좋을 것 같습니다.

예제 1번의 RGB 색비용 배열(cost 배열)

 

최소비용을 찾는 누적합 배열(sum 배열) 알고리즘

이후, 가장 마지막으로 더해진 배열의 R3, G3, B3 중 최솟값이, 가장 최소의 비용이란것을 알 수 있습니다.
위의 표와 같이, 이전 경우의 수를 배열에 저장하여 다음 계산에 재사용 할 수 있도록 만드는것이 핵심입니다.

 

코드 해석


 
RGB 숫자들을 cost라는 2차원배열에 담아주고, leastSum이라는 최소비용을 구하는 함수를 호출합니다.
첫번째 배열을 sum배열에 담아주고, 이후 부터는 위의 표와 같이 sum의 다음 배열에 누적합을 담아줍니다.
누적이 모두 끝나면 sum의 마지막 배열의 3개 원소에서 최솟값을 구해 반환합니다.
 

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

백준 24479 알고리즘 수업 - 깊이 우선 탐색 1 - JAVA  (1) 2025.01.30
백준 11399 ATM - JAVA  (0) 2025.01.29
백준 2346 풍선 터뜨리기 - JAVA  (0) 2025.01.27
백준 9184 신나는 함수 실행 - JAVA  (0) 2025.01.24
백준 28278 스택 2 - JAVA  (0) 2025.01.23
'알고리즘/백준' 카테고리의 다른 글
  • 백준 24479 알고리즘 수업 - 깊이 우선 탐색 1 - JAVA
  • 백준 11399 ATM - JAVA
  • 백준 2346 풍선 터뜨리기 - JAVA
  • 백준 9184 신나는 함수 실행 - JAVA
BIS's tech Blog
BIS's tech Blog
Welcome to Kanghyun's tech blog :)
  • BIS's tech Blog
    벼익숙의 기술 블로그
    BIS's tech Blog
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • 알고리즘 (46)
        • 백준 (37)
        • 프로그래머스 (9)
      • CS 스터디 (14)
        • CS - JAVA (11)
        • CS - DB (3)
      • Spring (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    동적 계획
    java
    bottom-up
    dp
    완전탐색
    기술질문
    DFS
    깊이 우선 탐색
    Baekjoon
    BFS
    자료구조
    프로그래머스
    Top-Down
    Lv2
    재귀
    알고리즘 고득점 kit
    CS
    브루트포스
    너비 우선 탐색
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
BIS's tech Blog
백준 1149 RGB거리 - JAVA
상단으로

티스토리툴바