코딩테스트

[제로베이스] 코테 3회차 영화보기 ( 다이나믹 프로그래밍 )

scone 2022. 7. 23. 04:49

🥕 영화보기

 

🍒 문제 분석

2일간, 하루에 16시간 씩 영화를 본다.

주말 동안 시청한 영화의 총 평점의 합이 최대가 되게 하자.

 

각 영화의 소요시간이 담긴 times 리스트와 영화의 평점이 담긴 scores 리스트가 주어진다.

( 영화는 끊고 다음날  볼 수 없다. )

 

[ 입력 설명 ]

영화 갯수는 만개 이하

최대 영화 시청 시간은 16 이하

최대 영화 평점은 10점

 

[ 매개변수 형식 ]

times = [4, 6, 2, 1, 4, 6, 11, 7]

scores = [3, 5, 2, 10, 6, 2, 3, 4]

 

[ 반환 값 형식 ]

32

 

🥑 해결 과정

1. DP 테이블을 다음과 같이 구성한다.

 

2. 영화가 1개만 있을 때

시간 4, 평점 3 짜리 영화라고 한다면

 

2. 영화가 2개 있을 때

2번 영화는 시간 6, 평점 5 라고 하자.

 

 

3. 이런 식으로 영화를 순회해 나가면서 그때그때 최적행을 찾아나간다.

( 만개의 영화에 대해서 한번만 순회를 시켜주면 dp 테이블이 채워진다. )

 

4. dp[16][16] 을 반환한다.

 

 

🍓 코드

MAX_HOUR = 16

def solution(times, scores):
    dp = [[[0 for _ in range(MAX_HOUR+1)] for _ in range(MAX_HOUR+1)] for _ in range(2)]

    for i in range(len(times)):
        for t1 in range(1, MAX_HOUR + 1):
            for t2 in range(1, MAX_HOUR + 1):
                val1, val2 = 0, 0
                if t1 >= times[i]:  # 영화를 볼 수 있다면 
                    val1 = dp[(i-1)%2][t1 - times[i]][t2] + scores[i]
                if t2 >= times[i]:
                    val2 = dp[(i-1)%2][t1][t2-times[i]] + scores[i]
                dp[i%2][t1][t2] = max(dp[(i-1)%2][t1][t2], val1, val2)
    
    return dp[(len(times)-1)%2][MAX_HOUR][MAX_HOUR]

 

 

🍉 깨달은 점 및 정리