본문 바로가기
공부 정리/백준

[백준] 자바 2156 포도주 시식

by 경적필패. 2021. 7. 27.
반응형

문제

효주는 포도주 시식회에 갔다. 그곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규칙이 있다.

  1. 포도주 잔을 선택하면 그 잔에 들어있는 포도주는 모두 마셔야 하고, 마신 후에는 원래 위치에 다시 놓아야 한다.
  2. 연속으로 놓여 있는 3잔을 모두 마실 수는 없다.

효주는 될 수 있는 대로 많은 양의 포도주를 맛보기 위해서 어떤 포도주 잔을 선택해야 할지 고민하고 있다. 1부터 n까지의 번호가 붙어 있는 n개의 포도주 잔이 순서대로 테이블 위에 놓여 있고, 각 포도주 잔에 들어있는 포도주의 양이 주어졌을 때, 효주를 도와 가장 많은 양의 포도주를 마실 수 있도록 하는 프로그램을 작성하시오. 

예를 들어 6개의 포도주 잔이 있고, 각각의 잔에 순서대로 6, 10, 13, 9, 8, 1 만큼의 포도주가 들어 있을 때, 첫 번째, 두 번째, 네 번째, 다섯 번째 포도주 잔을 선택하면 총 포도주 양이 33으로 최대로 마실 수 있다.

입력

첫째 줄에 포도주 잔의 개수 n이 주어진다. (1≤n≤10,000) 둘째 줄부터 n+1번째 줄까지 포도주 잔에 들어있는 포도주의 양이 순서대로 주어진다. 포도주의 양은 1,000 이하의 음이 아닌 정수이다.

출력

첫째 줄에 최대로 마실 수 있는 포도주의 양을 출력한다.


테스트 케이스

초록색 입력 / 검은색 출력

 

 


접근

원하는 만큼 와인의 배열을 받아서 최대한 와인을 많이 마시게끔 와인을 선택하는 문제입니다.

조건은 연속된 3개의 와인은 선택할 수 없는 것입니다.

dp문제이므로 규칙을 찾아서 점화식을 만드는 식으로 접근했습니다.

f(0) = 0

f(1) = 첫 번째 와인

f(2) = 첫 번째 와인 + 두 번째 와인

f(3) = 첫 번째 와인 + 두 번째 와인 vs 두 번째 와인 + 세 번째 와인 vs 첫 번째 와인 + 세 번째 와인

계속하다 보면 다음과 같은 규칙을 찾을 수 있습니다.

f(n) = f(n-1) vs f(n-3) + (n)+(n-1) vs f(n-2)+n

 

이를 이용해 코드를 짜니 문제를 해결할 수 있었습니다.


코드

import java.awt.desktop.SystemEventListener;
import java.io.*;
import java.math.*;
import java.util.*;

public class Main {

	/*
 	 2156 problem
	*/
	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int num = Integer.parseInt(br.readLine());
		ArrayList<Integer> arr = new ArrayList<>();
		ArrayList<Integer> dp = new ArrayList<>();
		int max = 0;
		for(int i=0; i<num; i++) {
			arr.add(Integer.parseInt(br.readLine()));
		}
		dp.add(0);
		dp.add(arr.get(0));
		if(num>=2)
		dp.add(arr.get(0)+arr.get(1));
		for(int i=3; i<num+1; i++) {
			dp.add(Math.max(dp.get(i-1), Math.max(arr.get(i-1)+arr.get(i-2)+dp.get(i-3), dp.get(i-2)+arr.get(i-1))));
		}
		
		for(int i=0; i<=num; i++) {
			if(max<dp.get(i)) {
				max = dp.get(i);
			}
		}
		bw.write(String.valueOf(max));
		bw.flush();
		bw.close();
	}
	
}

주의

x

 

반응형

댓글