RGB 거리 (백준 1149번) [JAVA]
반응형

 

문제

문제 링크 : www.acmicpc.net/problem/1149

 

1149번: RGB거리

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

www.acmicpc.net

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
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;
	}
}

 

결과

 

전문가가 아니라 정확하지 않은 지식이 담겨있을 수 있습니다.
언제든지 댓글로 의견을 남겨주세요!

 

반응형