문제 : https://www.acmicpc.net/problem/17404
17404번: RGB거리 2
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나
www.acmicpc.net
문제 요약 : 모든 집을 칠하는 비용의 최솟값을 출력한다.
| 입력 | 출력 |
| 2 ≤ N(집의 수) ≤ 1000 1 ≤ c(비용) ≤ 1000 |
모든 집을 칠하는 최소 비용 출력 |
JAVA
소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_17404.java
| 채점 번호 | 아이디 | 문제 번호 | 결과 | 메모리 | 시간 | 언어 | 코드 길이 |
| 31139157 | cbkpar | 17404 | 맞았습니다!! | 14548KB | 152ms | Java 11 | 1522B |
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n,i,t,m;
n = Integer.parseInt(br.readLine());
int[][] dp = new int[n][9];
dp[0][0] = dp[0][1] = 1000000000;
dp[0][3] = dp[0][5] = 1000000000;
dp[0][7] = dp[0][8] = 1000000000;
StringTokenizer st = new StringTokenizer(br.readLine());
dp[0][6] = Integer.parseInt(st.nextToken());
dp[0][4] = Integer.parseInt(st.nextToken());
dp[0][2] = Integer.parseInt(st.nextToken());
for(i=1;i<n;i++) {
st = new StringTokenizer(br.readLine());
t = Integer.parseInt(st.nextToken());
dp[i][0] = Math.min(dp[i-1][1], dp[i-1][2]) + t;
dp[i][3] = Math.min(dp[i-1][4], dp[i-1][5]) + t;
dp[i][6] = Math.min(dp[i-1][7], dp[i-1][8]) + t;
t = Integer.parseInt(st.nextToken());
dp[i][1] = Math.min(dp[i-1][0], dp[i-1][2]) + t;
dp[i][4] = Math.min(dp[i-1][3], dp[i-1][5]) + t;
dp[i][7] = Math.min(dp[i-1][6], dp[i-1][8]) + t;
t = Integer.parseInt(st.nextToken());
dp[i][2] = Math.min(dp[i-1][0], dp[i-1][1]) + t;
dp[i][5] = Math.min(dp[i-1][3], dp[i-1][4]) + t;
dp[i][8] = Math.min(dp[i-1][6], dp[i-1][7]) + t;
}
dp[n-1][2] = 1000000000;
dp[n-1][4] = 1000000000;
dp[n-1][6] = 1000000000;
m = Integer.MAX_VALUE;
for(i=0;i<9;i++) m = Math.min(m, dp[n-1][i]);
System.out.println(m);
}
}
배열을 [n][9] 크기로 만들어
[n][0~2]는 첫 번째 집을 빨강으로 색칠로 했을 경우
[n][3~5]는 첫 번째 집을 초록으로 색칠로 했을 경우
[n][6~8]는 첫 번째 집을 파랑으로 색칠로 했을 경우
[i][0,3,6]은 i번째 집을 빨강으로 칠한 비용
[i][1,4,7]은 i번째 집을 초록으로 칠한 비용
[i][2,5,8]은 i번째 집을 파랑으로 칠한 비용
이때 해당 i번째 집을 색칠하는 비용은
i번째 집을 해당 색으로 색칠하는 최소비용은
그 이전의 해당색을 제외한 집을 색칠한 최소비용과 i번째 집을 해당 색으로 색칠하는 값의 합이다.
예를 들어 i번째 집을 빨강으로 칠하는 경우는
i번째 집을 빨강으로 칠하는 비용 + i-1번째 집을 파랑 혹은 초록으로 칠하는 비용 중 작은 값이다.
마지막으로
빨강으로 시작했을 경우 빨강으로 끝나는 경우 또는
초록으로 시작했을 경우 초록으로 끝나는 경우 또는
파랑으로 시작했을 경우 파랑으로 끝나는 경우
위 3가지 경우를 제외해야 하므로 해당 값을 비용의 최대값으로 수정 후
해당 마지막배열의 최솟값을 출력한다.
'백준온라인' 카테고리의 다른 글
| [백준온라인] 1356번 유진수 (0) | 2021.08.04 |
|---|---|
| [백준온라인] 2546번 경제학과 정원영 (0) | 2021.08.03 |
| [백준온라인] 20040번 사이클 게임 (0) | 2021.08.01 |
| [백준온라인] 9252번 LCS 2 (0) | 2021.07.31 |
| [백준온라인] 2467번 용액 (0) | 2021.07.30 |