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

 

1149번: RGB거리

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

www.acmicpc.net

 

문제

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보다 작거나 같은 자연수이다.
  • 출력
  • 첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BJ_01149 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		//입력부
		int N = Integer.parseInt(br.readLine());
		int[][] color_cost = new int[N][3];
		for (int n = 0; n < N; n++) {
			String str = br.readLine();
			st = new StringTokenizer(str, " ");
			for(int f = 0; f <3; f++) {
				color_cost[n][f] =Integer.parseInt(st.nextToken());
			}
		}
		//i를 선택하는 가장 작은 min찾기
		//메모 배열
		int[][] memo = new int[N][3];
	
		//집이 1개일 때 초기화
		for(int i = 0; i < 3; i++) {
			memo[0][i] = color_cost[0][i];
		}
		
		//집이 2개 이상일 때
		int D_min = Integer.MAX_VALUE;
		for(int i = 1; i < N; i++) {
			for(int j = 0; j <3; j++) {
				D_min = Integer.MAX_VALUE;
				for(int k = 0; k < 3; k++) {
					if(j != k && D_min >= memo[i-1][k]+color_cost[i][j]) {
						D_min = memo[i-1][k]+color_cost[i][j];
						memo[i][j] = D_min;
					}
				}
			}
		}
		
		//마지막 memo 배열에서 최솟값 찾기
		int result = Integer.MAX_VALUE;
		for(int i = 0; i < 3; i++) {
			if(memo[N-1][i] <result) {
				result = memo[N-1][i];
			}
		}
		
		System.out.println(result);
	
	}
}

 

n번째 집이 n-1번 집과 다른 색을 선택하는 경우의 최소 비용합을 memo 배열에 저장해 풀이해 주었습니다.

'문제해결 > 백준' 카테고리의 다른 글

백준 10026번-적록색약(JAVA)  (0) 2021.09.22
백준 2527번-직사각형(JAVA)  (0) 2021.08.27
백준 2304번-창고 다각형(JAVA)  (0) 2021.08.25
백준 1753번-최단경로(JAVA)  (0) 2021.08.24
백준 10157번-자리배정(JAVA)  (0) 2021.08.24

+ Recent posts