Algorithm/λ°±μ€€

λ°±μ€€ 1149번 : RGB거리 (Java)

skyey94 2022. 1. 17. 01:45

πŸ”— 문제 링크

 

 

1149번: RGB거리

첫째 쀄에 μ§‘μ˜ 수 N(2 ≤ N ≤ 1,000)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” 각 집을 λΉ¨κ°•, 초둝, νŒŒλž‘μœΌλ‘œ μΉ ν•˜λŠ” λΉ„μš©μ΄ 1번 집뢀터 ν•œ 쀄에 ν•˜λ‚˜μ”© 주어진닀. 집을 μΉ ν•˜λŠ” λΉ„μš©μ€ 1,000보닀 μž‘κ±°λ‚˜

www.acmicpc.net


πŸ“– ν’€μ΄ κ³Όμ •

 

- λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ° μœ ν˜• + μž¬κ·€ μœ ν˜•μ˜ λ¬Έμ œμž…λ‹ˆλ‹€.
- 문제의 쑰건을 쒅합해보면, ν˜„μž¬ 인덱슀의 μ΅œμ†Œκ°’μ€ λ°”λ‘œ 직전 색깔을 μ œμ™Έν•œ λ‹€λ₯Έ 두가지 μƒ‰κΉ”μ€‘μ—μ„œ μ΅œμ†Œκ°’μ„ λ”ν•œ κ°’μž…λ‹ˆλ‹€.
- 그렇기에 μ–΄λ– ν•œ ν•œ μƒ‰κΉ”μ˜ νŠΉμ • μΈλ±μŠ€μ—μ„œμ˜ 값은 이전 색깔을 μ œμ™Έν•œ 두가지 색깔쀑에 μ΅œμ†Œκ°’μ„ ꡬ해야 ν•©λ‹ˆλ‹€.
- μ΄λŸ¬ν•œ λ°©μ‹μœΌλ‘œ 닡을 μ°Ύμ•„λ‚˜κ°€λ©΄, 닡이 될 수 μžˆλŠ” 값은 빨강색, μ΄ˆλ‘μƒ‰, νŒŒλž€μƒ‰ 3κ°€μ§€μž…λ‹ˆλ‹€. 
- λ”°λΌμ„œ, 이 세가지 값에 λŒ€ν•œ dp λ°°μ—΄μ˜ μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•˜λ©΄ λ‹΅μž…λ‹ˆλ‹€.
- μ•„λ§ˆ, κΈ€λ‘œ μž‘μ„±ν•΄μ„œλŠ” 이해가 λ˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄, solve λ©”μ†Œλ“œμ˜ λ‘œμ§μ„ ν•˜λ‚˜μ”© λ”°λΌκ°€λ³΄μ‹œλ©΄ 흐름을 μ΄ν•΄ν•˜μ‹€ 수 μžˆμ„ κ²λ‹ˆλ‹€.

 


πŸ’» μ½”λ“œ

 

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

public class Main {
 static int n,answer;
 static int[][] arr;
 static int[][] dp;
 
 public static void main(String[] args) throws IOException {
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  n = Integer.parseInt(br.readLine());
  arr = new int[n][3];
  dp = new int[n][3];
  answer = 0;
  
  for(int i = 0; i< n; i++){
   StringTokenizer st = new StringTokenizer(br.readLine()," ");
   for(int j = 0; j< 3; j++){
    arr[i][j] = Integer.parseInt(st.nextToken());
   }
  }
  dp[0][0] = arr[0][0];
  dp[0][1] = arr[0][1];
  dp[0][2] = arr[0][2];
 
  int answer = Math.min(solve(n-1,0),Math.min(solve(n-1,1),solve(n-1,2)));
  System.out.println(answer);
 }
 
 private static int solve(int idx, int color){
  if(dp[idx][color] == 0){
   if(color == 0){
    dp[idx][0] = Math.min(solve(idx-1,1),solve(idx-1,2)) + arr[idx][0];
   }else if(color == 1){
    dp[idx][1] = Math.min(solve(idx-1,0),solve(idx-1,2)) + arr[idx][1];
   }else if(color == 2){
    dp[idx][2] = Math.min(solve(idx-1,0),solve(idx-1,1)) + arr[idx][2];
   }
  }
  return dp[idx][color];
 }
}