[백준] 2156번 : 포도주 시식 - JAVA

SUBNY·2023년 8월 8일
0

백준

목록 보기
11/22
post-thumbnail

백준문제캡쳐

(https://www.acmicpc.net/problem/2156)





접근 방법 🧐

같은 주간에 풀었던 계단오르기 문제와 다른 점은, 마지막 잔을 꼭 마셔야한다던가하는 조건이 없다.
계단 오르기 풀이

과거 KB에서 배웠전 구간합 풀이로 풀었다.

세가지 조건으로 나눴다.
1. 포도주가 1잔일 때 → 그 1잔이 최대
2. 포도주가 2잔일 때 → 1잔 + 2잔이 최대
3. 포도주가 3잔일 때 → 위 그림처럼 경우가 나뉘어질 수 있다.
   - 검은 색이 마시는 포도주라고 했을 때, 3잔 연속으로 마실 수 없기에 저렇게 나뉘어진다.
   - 4잔 이후부터는 반복되서 n~n-3을 한 묶음으로 Math.max를 이용해 최댓값 구했다.


  • drink[i-3] + wine[i-1]+wine[i] = n-3, n-1, n번째 잔 마셨을 때

  • drink[i-2] + wine[i] = n-3, n-2, n번째 잔 마셨을 때

  • drink[i-1] = n-2, n-1 번째 잔 마셨을 때
    → drink[i-2] + wine[i-1] 로 나눌 필요가 없다. 이 경우는 n번째를 안 마시는 것이 주요한 경우라 생각했다. 그러니, n번째는 안마시면서 n-1번째 잔까지 최댓값을 구하는 경우라고 보면 될 듯하다.



내가 쓴 코드 ✍️

import java.io.*;

public class Main {

	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int n = Integer.parseInt(br.readLine());//포도주 잔 개수
		
		int[] wine = new int[n+1]; //각 포도주의 양
		int[] drink = new int[n+1]; //효주가 마시는 양
		
		for(int i=1;i<=n;i++) {
			wine[i] = Integer.parseInt(br.readLine());
		}
		
		if(n==1) {
			drink[1] = wine[1];
		}
		else if(n==2) {
			drink[2] = wine[1]+wine[2];
		}
		else {
			drink[1] = wine[1];
			drink[2] = wine[1]+wine[2];
			
			for(int i=3;i<=n;i++) {
				drink[i] = Math.max(drink[i-2]+wine[i],Math.max(drink[i-1], drink[i-3]+wine[i-1]+wine[i]));
			}
		}
		
		bw.write(drink[n]+"");
		bw.flush();
		bw.close();
	}

}
	}
}

느낀점 📖

선정된 문제들을 볼 때만 해도, 이걸 내가 풀 수 있을까.. 실버1...? 정답률 30퍼센트라니...
싶었는데, 그림 그리면서 차근차근 풀다보니 생각보다 풀만했던 문제였다! 역시 손으로 푸는게 제일이다 👍

profile
대체할 수 없는 풀스택 개발자가 되고 싶어요

0개의 댓글