Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 순열
- EditText
- dfs
- hilt
- 프로그래머스
- 완전탐색
- 백준
- 순수함수
- 백준 14501
- 시뮬레이션
- 2501
- java
- 조합
- 백준 퇴사
- 오르막수
- imeOptions
- SWEA
- val
- BuildConfig
- EditorInfo
- 스카이라인 쉬운거
- Parcelable
- 약수 구하기
- BFS
- Parcelize
- Android
- Kotlin
- 최단경로
- 자바
- 지능형 기차2
Archives
- Today
- Total
안드 공부를 해볼까?
[Java] 백준 포도주 시식 본문
728x90
1. 문제분석
포도주를 어떻게 하면 많이 마실 수 있는지 확인하는 문제다.
연속해서 3잔은 마실 수 없고 그 중에서 가장 많이 마시는 경우를 해결해야 한다.
이 문제의 경우 백준의 계단 오르기(?)문제와 동일하다 3계단을 연속해서 올라갈 수 없고 마지막을 무조건 밟아야 하는 경우지만 이 문제는 마지막을 마시지 않아도 된다.
먼저 점화식을 세워보기 위해 테스트 케이스 1인 6 10 13 9 8 1를 보자.
첫번째 6을 마신 경우는 최대가 6이된다. -> DP[1]
두번째까지는 연속해서 마셔도 된다 최대가 6+6 = 12가 된다. -> DP[2]
세번째부턴 조건에 부합하게 마셔야 한다. 여기서 2가지를 볼 수 가 있다.
-세번째 포도주를 먹는 경우
1. 첫번째까지의 최댓값 + 세번째의 값 -> DP[1] + arr[3]이 된다.
2. 0번째까지의 최댓값 + 1번째의 값 + 3번째의 값 -> DP[0] + arr[1] + arr[3]이 된다.
-세번째 포도주를 안먹는 경우
1. 전단계 까지의 최대값 -> DP[2]
총 3가지의 경우 중 최대값을 구하면 된다.
2. 구현
import java.io.*;
import java.nio.Buffer;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int totalTestCase = Integer.parseInt(br.readLine());
int[] arr = new int[totalTestCase + 1];
int[] dp = new int[totalTestCase + 1];
for(int i =1; i<totalTestCase+1; i++){
arr[i] = Integer.parseInt(br.readLine());
}
dp[1] = arr[1];
if(totalTestCase > 1){
dp[2] = arr[1] + arr[2];
}
//무조건 2부터 구하는게 아니다. 조건을 보고 3개가 될 수도있고 4개가 될 수도 있는거다.
for(int i = 3; i<totalTestCase+1; i++){
/**
* 내가 현재 포도주를 먹을까 말까?
* 현재자리 + 전전자리의 최댓값(3개 연속은 안되니까)
* 현재자리 + 전전전자리의 최댓값 + 전자리의 값(3개 연속은 안되니까)
* 전자리의 최댓값(난 안먹을꺼다?)
* */
dp[i] = Math.max((dp[i-2]+arr[i]),Math.max(dp[i-1],(dp[i-3]+arr[i-1]+arr[i])));
}
System.out.println(dp[totalTestCase]);
}
}
여기서 볼점은 dp[2]의 값이다.
어찌 됐건 dp[2]는 배열의 크기가 1보다 크다면 arr[0]+arr[1]이 된다.
초기화를 해주고 3번째 경우부터 보면 된다.
3. 마무리
나는 항상 dp를 2부터 구해야한다고 생각을 했는데 어찌됐건 값만 구하면 되는 것이였다.
또한 3개중 최댓값을 처음에는 생각했지만 왜 3개가 나오지? 2개가 나와야하는데.. 라는 생각으로 한참을 해맸다.
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[Java] 백준 퇴사 2 (0) | 2022.08.09 |
---|---|
[Java] 백준 동전 2 (0) | 2022.08.06 |
[Java] 백준 스티커 (0) | 2022.08.06 |
[Java] 백준 가장 큰 부분 수열 (0) | 2022.08.02 |
[Java] 백준 연속합 (0) | 2022.08.02 |
Comments