티스토리 뷰

728x90
반응형

문제

 

효주는 포도주 시식회에 갔다. 

그곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 

효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규칙이 있다.

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

 

효주는 될 수 있는 대로 많은 양의 포도주를 맛보기 위해서 어떤 포도주 잔을 선택해야 할지 고민하고 있다. 

1부터 n까지의 번호가 붙어 있는 n개의 포도주 잔이 순서대로 테이블 위에 놓여 있고, 

각 포도주 잔에 들어있는 포도주의 양이 주어졌을 때, 

효주를 도와 가장 많은 양의 포도주를 마실 수 있도록 하는 프로그램을 작성하시오. 

예를 들어 6개의 포도주 잔이 있고, 각각의 잔에 순서대로 6, 10, 13, 9, 8, 1 만큼의 포도주가 들어 있을 때, 

첫 번째, 두 번째, 네 번째, 다섯 번째 포도주 잔을 선택하면 총 포도주 양이 33으로 최대로 마실 수 있다.

 

입력

 

첫째 줄에 포도주 잔의 개수 n이 주어진다. (1 ≤ n ≤ 10,000) 

둘째 줄부터 n+1번째 줄까지 포도주 잔에 들어있는 포도주의 양이 순서대로 주어진다. 

포도주의 양은 1,000 이하의 음이 아닌 정수이다.

 

출력

 

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

 

풀이

 

이전 문제들과 마찬가지로 기본적인 동적계획법을 이용해 풀 수 있는 문제이다.

 

다만 내가 느끼기엔 이번 문제는 조건이 제법 까다로웠는데,

 

무슨 소린지 이해는 하지만 그걸 코드로 나타내는 것이 쉽지 않아 여러 번 테스트를 해야 했다.

 

결국 세 가지로 나누어 최댓값을 비교했는데,

 

  1. memo[i - 1]: 직전 포도주가 연속된 두 번째 잔이라 i번째 잔을 마실 수 없을 때.
  2. memo[i - 2] + wines[i]: i - 2 번째의 포도주가 연속된 두 번째 잔일 경우
  3. memo[i - 3] + wines[i - 1] + wines[i]: i - 3 번째의 포도주가 연속된 두 번째 잔일 경우

솔직히 아직도 좀 헷갈리는데..

 

반복해서 더 풀어봐야겠다.

 

코드는 아래와 같다.

 

우선 자바.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Prob2156_3 {

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int n = Integer.parseInt(br.readLine());
		int[] wines = new int[n + 1];
		int[] memo = new int[n + 1];

		for (int i = 1; i <= n; i++) {
			wines[i] = Integer.parseInt(br.readLine());
		}

		memo[1] = wines[1];

		if (n >= 2) {
			memo[2] = memo[1] + wines[2];
		}

		for (int i = 3; i <= n; i++) {
			memo[i] = Math.max(memo[i - 1], Math.max(memo[i - 2] + wines[i], memo[i - 3] + wines[i - 1] + wines[i]));
		}

		System.out.println(memo[n]);
	}
}

다음은 파이썬이다.

import sys

n = int(sys.stdin.readline().rstrip())
wines = [0 for _ in range(n + 1)]
memo = [0 for _ in range(n + 1)]

for i in range(1, n + 1):
    wines[i] = int(sys.stdin.readline().rstrip())

memo[1] = wines[1]

if n >= 2:
    memo[2] = memo[1] + wines[2]

for i in range(3, n + 1):
    memo[i] = max(memo[i - 1], memo[i - 2] + wines[i], memo[i - 3] + wines[i - 1] + wines[i])

print(memo[n])
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
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
글 보관함