본문 바로가기
알고리즘/매일마다 풀기(백준)

[2023-04-25] 2156 포도주 시식(Kotlin)

by joh9911 2023. 4. 25.

 

문제 링크: https://www.acmicpc.net/problem/2156

 

2156번: 포도주 시식

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

www.acmicpc.net

 

오랜시간 고민을 했지만 결국 풀지 못했고,

 

또 다른 분의 코드를 참고하였습니다..

 

참고 링크: https://hanyeop.tistory.com/287

 

package twentyfivethDay
import java.io.*
import java.util.*
import kotlin.math.max

fun main() = with(Scanner(System.`in`)){
    val n = nextInt()
    val grape = Array(n+1){0}
    val dp = Array(n+1){0} // 최대값 저장

    // 헷갈리지 않기 위해 인덱스 1부터 시작
    grape[0] = 0

    // 포도주 잔 입력
    for(i in 1 until grape.size){
        grape[i] = nextInt()
    }

    for(i in dp.indices){ // 6, 10, 13, 9, 8, 1
        when (i) {
            0 -> dp[i] = grape[0] // 포도주가 0개 ( 계산과정용 )
            1 -> dp[i] = grape[1] // 첫번째 포도주 마시기
            2 -> dp[i] = grape[1] + grape[2] // 두번째 포도주 마시기
            // 세번째 이상 포도주 마시기
            else -> {
                /**
                 * 1. 안마시는 경우
                 * 2. 1번 연속으로 마시는 경우
                 * 3. 2번 연속으로 마시는 경우
                 */
                dp[i] = max(max(dp[i-1], (grape[i] + dp[i-2])), (grape[i] + grape[i-1] + dp[i-3]))
            }
        }
    }

    println(dp[n])
}

 

 

저는 코드를 보고 다시 문제를 풀어보려해도

 

 

저렇게 풀이를 떠올리지 못할 것 같아요

 

 

저렇게 생각하는 방식을 훈련해야 하나,,,

 

 

너무 어렵습니다.

댓글