본문 바로가기
BaekJoon

[백준] 1149번 : RGB거리(JAVA)

by GrayChoi 2019. 12. 4.
반응형

멀고도 험난한 Dynamic Programming Master의 길...

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

 

1149번: RGB거리

RGB거리에 사는 사람들은 집을 빨강, 초록, 파랑중에 하나로 칠하려고 한다. 또한, 그들은 모든 이웃은 같은 색으로 칠할 수 없다는 규칙도 정했다. 집 i의 이웃은 집 i-1과 집 i+1이고, 첫 집과 마지막 집은 이웃이 아니다. 각 집을 빨강으로 칠할 때 드는 비용, 초록으로 칠할 때 드는 비용, 파랑으로 드는 비용이 주어질 때, 모든 집을 칠하는 비용의 최솟값을 구하는 프로그램을 작성하시오.

www.acmicpc.net

위의 문제는 BaekJoon Online Judge의 단계별로 풀어보기 중 14단계

 

동적 계획법 1의 카테고리에 포함되어 있는 문제이다.

 

혼자 해결해보려고 했다가 힘들어서 검색을 통해 이해하고 문제를 해결하였다.

 

문제를 스스로 해결하지 못해 안타깝지만 시간이 지나면 더 나아져있을 것이라고 믿고 더 노력해야겠다.

 

문제의 예시에서 첫 번째 집을 칠하는 비용은 26 40 83이다.

 

그 다음 첫 번째 집을 칠하고 두 번째 집을 칠할 때 최소비용은 49+40 60+26 57+26 이다.

 

마지막으로 세 번째 집을 칠할 때 최소비용은 89+89 86+13 83+13 이다.

 

마지막 집을 칠하고 나서의 배열에 저장된 최솟값이 문제의 정답이다.

 

import java.util.Scanner;

public class Question_1149 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int N = sc.nextInt();
		int[][] House = new int[N][3];
		
		for(int i = 0; i < N; i++) {
			House[i][0] = sc.nextInt();
			House[i][1] = sc.nextInt();
			House[i][2] = sc.nextInt();
		}
		
		for(int i = 1; i < N; i++) {
			House[i][0] += Math.min(House[i-1][1], House[i-1][2]);
			House[i][1] += Math.min(House[i-1][0], House[i-1][2]);
			House[i][2] += Math.min(House[i-1][0], House[i-1][1]);
		}
		System.out.println(Math.min(House[N-1][0], Math.min(House[N-1][1], House[N-1][2])));
	}

}
반응형

댓글