ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 1149 RGB거리
    ALGORITHM/BOJ 2020. 11. 7. 20:40

    www.acmicpc.net/problem/1149

     

    1149번: RGB거리

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

    www.acmicpc.net

    2020-11-07


    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main1149 {
    	public static int N, arr[][], dp[][];
    	
    	public static void main(String[] args) throws Exception {
    		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    		StringTokenizer st = new StringTokenizer(bf.readLine().trim());
    		N = Integer.parseInt(st.nextToken());
    		
    		arr = new int[N][3];
    		dp = new int[N][3];
    		
    		for(int i = 0; i < N; i++) {
    			st = new StringTokenizer(bf.readLine());
    			for(int j = 0; j < 3; j++) {
    				arr[i][j] = Integer.parseInt(st.nextToken());
    			}
    		}
    		
    		dp[1][0] = arr[1][0] + Math.min(arr[0][1], arr[0][2]);
    		dp[1][1] = arr[1][1] + Math.min(arr[0][0], arr[0][2]);
    		dp[1][2] = arr[1][2] + Math.min(arr[0][0], arr[0][1]);
    		
    		for(int i = 2; i < N; i++) {
    			dp[i][0] = arr[i][0] + Math.min(dp[i-1][1], dp[i-1][2]);
    			dp[i][1] = arr[i][1] + Math.min(dp[i-1][0], dp[i-1][2]);
    			dp[i][2] = arr[i][2] + Math.min(dp[i-1][0], dp[i-1][1]);
    		}
    		System.out.println(Math.min(dp[N-1][0], Math.min(dp[N-1][1],dp[N-1][2])));
    	}
    }

    힌트를 받아서 풀었다.

     

    먼저, 각 집의 빨강, 초록, 파랑으로 칠할 때 드는 비용 값은 arr[N][3] 에 저장했다. 

     

    1. 2번째 집을 먼저 빨강으로 칠할 때의 최소 비용은 1번째 집을 초록 또는 파랑으로 칠할 때의 최솟값 + 2번째 집을 빨강으로 칠할 때 드는 비용이 된다. 이것을 dp 라는 배열에 저장했다. 같은 방법으로 2번째 집을 초록, 파랑으로 칠할 때 드는 비용도 계산할 수 있다.

    dp[1][0] = arr[1][0] + Math.min(arr[0][1], arr[0][2]);
    dp[1][1] = arr[1][1] + Math.min(arr[0][0], arr[0][2]);
    dp[1][2] = arr[1][2] + Math.min(arr[0][0], arr[0][1]);

    이 값을 초기값으로 저장해둔다. 입력 값에서 집의 수(N) 2<= N <= 1000 이라는 전제가 있다. 만약 N이 2이면 초기값이 모든 집을 칠하는 최소 비용이 될 것이다.

     

    2. N이 2보다 크면 현재 집을 빨강으로 칠할 때의 최소 비용은 그 전의 집을 초록 또는 파랑으로 칠할 때의 최솟값과 현재 집을 빨강으로 칠할 때의 최소 비용을 합한 값이 된다.

    for(int i = 2; i < N; i++) {
    	dp[i][0] = arr[i][0] + Math.min(dp[i-1][1], dp[i-1][2]);
    	dp[i][1] = arr[i][1] + Math.min(dp[i-1][0], dp[i-1][2]);
    	dp[i][2] = arr[i][2] + Math.min(dp[i-1][0], dp[i-1][1]);
    }

    3. 마지막으로 마지막 집까지 칠했을 때 빨강, 초록, 파랑 기준으로 가장 최소 비용을 출력하면 된다.

    System.out.println(Math.min(dp[N-1][0], Math.min(dp[N-1][1],dp[N-1][2])));

    'ALGORITHM > BOJ' 카테고리의 다른 글

    [백준] 1068 트리  (0) 2020.11.08
    [백준] 1197 최소 스패닝 트리  (0) 2020.11.07
    [백준] 2606 바이러스  (0) 2020.11.06
    [백준] 13300 방 배정  (0) 2020.11.06
    [백준] 14503 로봇 청소기  (0) 2020.11.03

    댓글

Programming Diary