문제
문제 링크 : www.acmicpc.net/problem/1149
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
0.5초 | 128 MB | 42278 | 19796 | 14886 | 47.678% |
RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.
집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.
- 1번 집의 색은 2번 집의 색과 같지 않아야 한다.
- N번 집의 색은 N-1번 집의 색과 같지 않아야 한다.
- i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다.
입력
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.
풀이
우선 작은 문제로 나누었다
-> Painting(index, B) = Min( Painting(index-1, R), Painting(index-1, G) ) + cost[index] [B];
이때 이전 값들을 paint 배열에 저장해놓으면, 그냥 이전 값들만 호출하면 된다. (중복 줄임)
-> Painting(index,B) = Min (paint[index-1] [R] , paint [index-1] [G]) + cost[index]
이것을 index 1 ~ N-1까지 실행해주었다.
코드
import java.io.IOException;
public class Main {
public static StringBuilder sb = new StringBuilder();
public static java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
static int N;
static int[][] cost;
static int[][] paint;
public static void main(String[] args) throws IOException{
N = Integer.parseInt(br.readLine());
cost = new int[N][3];
paint = new int[N][3];
for(int i=0; i<N; i++){
String str[] = br.readLine().split(" ");
cost[i][0] = Integer.parseInt(str[0]);
cost[i][1] = Integer.parseInt(str[1]);
cost[i][2] = Integer.parseInt(str[2]);
}
System.out.println(solve());
}
public static void Painting(int index, int color){
int color1 = paint[index-1][(color+1)%3];
int color2 = paint[index-1][(color+2)%3];
paint[index][color] = Math.min(color1, color2) + cost[index][color];
}
public static int solve(){
int ans;
//초기화
paint[0][0] = cost[0][0];
paint[0][1] = cost[0][1];
paint[0][2] = cost[0][2];
for(int i =1; i<N; i++){
for(int color = 0; color <3; color++){
Painting(i,color);
}
}
ans = paint[N-1][0];
ans = Math.min(ans, paint[N-1][1]);
ans = Math.min(ans, paint[N-1][2]);
return ans;
}
}
import java.io.IOException;
public class Main {
public static StringBuilder sb = new StringBuilder();
public static java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
static int N;
static int[][] cost;
static int[][] paint;
public static void main(String[] args) throws IOException{
N = Integer.parseInt(br.readLine());
cost = new int[N][3];
paint = new int[N][3];
for(int i=0; i<N; i++){
String str[] = br.readLine().split(" ");
cost[i][0] = Integer.parseInt(str[0]);
cost[i][1] = Integer.parseInt(str[1]);
cost[i][2] = Integer.parseInt(str[2]);
}
System.out.println(solve());
}
public static void Painting(int index, int color){
int color1 = paint[index-1][(color+1)%3];
int color2 = paint[index-1][(color+2)%3];
paint[index][color] = Math.min(color1, color2) + cost[index][color];
}
public static int solve(){
int ans;
//초기화
paint[0][0] = cost[0][0];
paint[0][1] = cost[0][1];
paint[0][2] = cost[0][2];
for(int i =1; i<N; i++){
for(int color = 0; color <3; color++){
Painting(i,color);
}
}
ans = paint[N-1][0];
ans = Math.min(ans, paint[N-1][1]);
ans = Math.min(ans, paint[N-1][2]);
return ans;
}
}
결과
전문가가 아니라 정확하지 않은 지식이 담겨있을 수 있습니다.
언제든지 댓글로 의견을 남겨주세요!
'알고리즘 > 문제풀이' 카테고리의 다른 글
도서관 (백준 1491) [JAVA] (0) | 2020.12.27 |
---|---|
LCS (백준 9251번) [JAVA] (0) | 2020.12.26 |
합친 LIS(JLIS) [JAVA] (0) | 2020.12.26 |
국회의원 선거(백준 1417번) [JAVA] (0) | 2020.12.26 |
Longest Increasing Sequence (알고스팟) (LIS) [JAVA] (0) | 2020.12.26 |
Comment