코테/백준

[백준/JAVA] 17404번: RGB거리 2

imname1am 2024. 4. 9. 23:53
반응형

📖 문제

 

17404번: RGB거리 2

첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나

www.acmicpc.net

 

 

 

 

💡  풀이 방식

• DP

dp[ i ][ j ] = k
⇒ 1~i번째 집까지 칠하고 i번째 집은 j색으로 칠했을 때의 최소 비용은 k

 

 

1. 첫 집에 칠할 색 k를 정한다. 그러고 나면 나머지 색으로는 첫 집을 칠할 수 없으므로 나머지 칸들은 최댓값으로 설정한다. (0: 빨강 / 1: 초록 / 2: 파랑)

→ dp[1][0] : 첫 집을 빨간색으로 칠함. 나머지 dp[1][1] = dp[1][2] = INF

→ dp[1][1] : 첫 집을 초록색으로 칠함. 나머지 dp[1][0] = dp[1][2] = INF

→ dp[1][2] : 첫 집을 파랑색으로 칠함. 나머지 dp[1][0] = dp[1][1] = INF

for(int i = 0 ; i < 3 ; i++) {
    dp[1][i] = (i == k) ? rgb[1][i] : INF;	// k: 첫 집에 칠하기로 정한 색상
}

 

 

2. 두 번째 집부터 색칠한다.

for(int i = 2 ; i <= N ; i++) {
    dp[i][0] = Math.min(dp[i-1][1], dp[i-1][2]) + rgb[i][0];
    dp[i][1] = Math.min(dp[i-1][0], dp[i-1][2]) + rgb[i][1];
    dp[i][2] = Math.min(dp[i-1][0], dp[i-1][1]) + rgb[i][2];
}

 

 

3. 마지막 집은 첫 집과 같은 색을 칠할 수 없으므로 첫 집의 색에 따라 마지막 집의 남은 두 색깔 중 더 작은 값을 구한다.

- 첫 집이 빨강색이면, 마지막 집은 초록/파랑으로 칠한 dp 값 중 최솟값 구함

- 첫 집이 초록색이면, 마지막 집은 빨강/파랑으로 칠한 dp 값 중 최솟값 구함

- 첫 집이 파랑색이면, 마지막 집은 빨강/초록으로 칠한 dp 값 중 최솟값 구함

for(int i = 0 ; i < 3 ; i++) {
    if(k != i)  // 첫 집 색 != 마지막 집 색
        answer = Math.min(answer, dp[N][i]);
}

 

 

 

🔺 코드

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
37
38
39
40
41
42
43
44
45
46
47
48
import java.util.*;
import java.io.*;
 
public class Main {
    static final int INF = 1000*1000 +1;
    
    static int N;
    static int[][] rgb, dp;
    static int answer = INF;
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        
        N = Integer.parseInt(br.readLine());
        
        rgb = new int[N+1][3];
        for(int i = 1 ; i <= N ; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            for(int j = 0 ; j < 3 ; j++) {
                rgb[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        
        dp = new int[N+1][3];
        for(int k = 0 ; k < 3 ; k++) {  // 0: RED / 1: GREEN / 2: BLUE
            // 초기화: 첫 번째 줄의 i번째 집에는 i색을 칠함
            for(int i = 0 ; i < 3 ; i++) {
                dp[1][i] = (i == k) ? rgb[1][i] : INF;
            }
            
            for(int i = 2 ; i <= N ; i++) { // 2번째 집부터 색칠
                dp[i][0= Math.min(dp[i-1][1], dp[i-1][2]) + rgb[i][0];
                dp[i][1= Math.min(dp[i-1][0], dp[i-1][2]) + rgb[i][1];
                dp[i][2= Math.min(dp[i-1][0], dp[i-1][1]) + rgb[i][2];
            }
            
            // 정답 최솟값 구하기
            for(int i = 0 ; i < 3 ; i++) {
                if(i != k)  // 첫 집 색 != 마지막 집 색
                    answer = Math.min(answer, dp[N][i]);
            }
        }
        
        System.out.println(answer);
    }
}
 
cs

 

 

 

 

➕ 다른 풀이 방식

엇 내가 풀려고 생각했던 방식과 비슷하심

 

백준 17404번 RGB거리 2 [JAVA]

문제 RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다. 집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로

sangbeomkim.tistory.com


💦 어려웠던 점

- DP인 건 캐치했고, 심지어 점화식도 제대로 세웠는데 초기값을 어떻게 설정하지?의 문제..

- 처음 / 중간/ 끝으로 나눠 색깔이 어떻게 겹치지 않게 해야할지 고민되었다...

 

 

🧐 새로 알게 된 내용

- 첫 번째 집에는 그냥 i색을 칠하자...

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

 

[백준 17404: JAVA] RGB거리 2 / 동적 프로그래밍

개요 dp로 문제를 풀 수 있다. 이 문제는 dp를 생각하면 금방 풀이할 수 있지만, 약간의 조건이 추가되어 있기 때문에 생각을 좀 해야 했다. 첫 집과 마지막 집도 색이 같으면 안 된다는 조건이 있

dragon-h.tistory.com

 

 

백준 17404번 RGB거리 2 [JAVA]

문제 RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다. 집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로

sangbeomkim.tistory.com

 

반응형