https://www.acmicpc.net/problem/1149
백준님이 코테에서 dp는 잘 안 나온다고 하셨지만 그래도 dp문제를 잘 못 푼다고 생각해서.. 쉬운 문제를 풀어보았다.
풀면서 DP의 기본은 dp[i] = dp[i-1] + a 라는 것을 알게되었다. (이전값을 통해서 현재값을 계산)
이문제의 경우에는 이전 값을 통해서 다음 값을 계산하기 때문에 굳이 리스트를 통해 dp테이블을 가지고 있을 필요는 없었다. 하지만 dp문제를 접했을 때 dp테이블을 사용하는 경우가 많기 때문에 리스트나 배열을 통해 테이블을 생성하여 푸는 습관은 좋은 것 같아서 코드에 남겨두었다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class bj1149 {
static int N;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
int pre1 = 0;
int pre2 = 0;
int pre3 = 0;
ArrayList <int[]>scores = new ArrayList<>(); //결과리스트
for(int n=0;n<N;n++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int now1 = Integer.parseInt(st.nextToken());
int now2 = Integer.parseInt(st.nextToken());
int now3 = Integer.parseInt(st.nextToken());
//이전 결과를 통해 현재결과 계산//
int min1 = Math.min(now1+pre2,now1+pre3);
int min2 = Math.min(now2+pre1, now2+pre3);
int min3 = Math.min(now3+pre1, now3+pre2);
scores.add(new int[] {min1,min2,min3});
//pre에 현재결과 저장(다음 값 계산을 위해)//
pre1=min1;
pre2=min2;
pre3=min3;
}
System.out.println(Math.min(Math.min(pre1, pre2), pre3));
}
}
'개발 > 알고리즘' 카테고리의 다른 글
백준 1062번 가르침 (0) | 2021.06.17 |
---|---|
백준 9465번 스티커 (0) | 2021.06.10 |
백준 11725번 트리의 부모 찾기 (0) | 2021.06.08 |
백준 2644번 촌수계산 (0) | 2021.06.08 |
백준 21608번 상어초등학교 (0) | 2021.06.07 |