반응형
- 알고리즘 분류 : 다이나믹 프로그래밍, Bottom-Up 방식
- 사용 언어 : JAVA
- 문제 요점
- 3잔 연속으로 마시는 것 금지
- 현재 잔으로부터 이전 3번 째 잔까지만 확인
- 3번 째 잔부터 아래 3개의 항목 중 값이 큰 항목으로 적용
- 현재 잔 안마시기
- 2번째 전의 잔까지 마셨던 거 + 현재 잔 마시기
- 3번째 잔의 전까지 마셨던 거 + 이전 잔 마시기 + 현재 잔 마시기)
- 포도주의 잔 갯수는 1이상이므로, d[2] 계산식을 조건에 두어 처리
소스 설명은 주석을 참고해주세요.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N+1];
int[] d = new int[N+1];
for(int i=1; i<=N; i++) {
arr[i] = Integer.parseInt(br.readLine());
}
d[1] = arr[1];
// 포도주의 잔 갯수가 1이 될 수도 있기에 에러를 방지
if(N>1) {
d[2] = arr[1] + arr[2];
}
// 조건 : 연속 3잔만 마시면 되지 않음
// 아래 3가지 경우 중, 큰 것 선택
// (현재 잔 안마시기) or (2번째 전의 잔까지 마셨던 거 + 현재 잔 마시기) or (3번째 잔의 전까지 마셨던 거 + 이전 잔 마시기 + 현재 잔 마시기)
for(int i=3; i<=N; i++) {
d[i] = Math.max(d[i-1],Math.max(d[i-2] + arr[i], d[i-3] + arr[i-1] + arr[i]));
}
System.out.println(d[N]);
}
}
좋은 지적과 지식 공유는 언제나 환영합니다^^
반응형
'Algorithm' 카테고리의 다른 글
[BAEKJOON] 1912번 : 연속합 (JAVA) (0) | 2022.01.29 |
---|---|
[BAEKJOON] 2579번 : 계단오르기 (JAVA) (0) | 2022.01.28 |
[BAEKJOON] 1149번 : RGB거리 (0) | 2022.01.25 |
[BAEKJOON] 9095번 : 1, 2, 3 더하기 (0) | 2022.01.24 |
[이것이 코딩테스트다] 7. 다이나믹 프로그래밍 - 실전 문제 풀이 (0) | 2022.01.23 |