취업 및 이직 준비/코딩테스트 준비

코딩테스트 - 파이썬 - 스티커 수집 문제

code2772 2023. 4. 20. 12:15
728x90
반응형
def solution(sticker):
    n = len(sticker)

    if n <= 2:  # 스티커가 1개 또는 2개일 경우 가장 큰 값 반환
        return max(sticker)

    dp1 = [0] * n  # 0번 스티커부터 시작하는 경우
    dp1[0] = sticker[0]
    dp1[1] = max(sticker[0], sticker[1])
    for i in range(2, n-1):
        dp1[i] = max(dp1[i-1], dp1[i-2] + sticker[i])

    dp2 = [0] * n  # 1번 스티커부터 시작하는 경우
    dp2[n-1] = sticker[n-1]
    dp2[n-2] = max(sticker[n-1], sticker[n-2])
    for i in range(n-3, 0, -1):
        dp2[i] = max(dp2[i+1], dp2[i+2] + sticker[i])

    return max(dp1[n-2], dp2[1])  # 두 경우 중 가장 큰 값 반환


목표는 인접한 스티커를 수집할 수 없다는 제약 조건에 따라 스티커의 하위 집합을 수집하여 총점 값을 최대화하는 것

1. 스티커 목록의 길이가 2보다 작거나 같으면 최대 점수 값은 단순히 목록의 최대 요소입니다. 그렇지 않으면 함수는 두 개의 동적 프로그래밍 배열 'dp1' 및 'dp2'를 계산합니다.

2. 'dp1'은 마지막 스티커까지(포함하지 않음) 스티커를 모으면 얻을 수 있는 최대 포인트 값을 나타냅니다.

 

3. dp1의 처음 두 요소는 sticker의 처음 두 요소로 초기화되고 나머지 요소는 반복 관계 dp1[i] = max(dp1[i-1], dp1[i]를 사용하여 반복적으로 계산됩니다. -2] + 스티커[i]).

4. 'dp2'는 첫 번째 스티커부터(포함하지 않음) 스티커를 모을 때 얻을 수 있는 최대 포인트 값을 나타냅니다.

 

5. dp2의 마지막 2개 요소는 sticker의 마지막 2개 요소로 초기화되고 나머지 요소는 반복 관계 dp2[i] = max(dp2[i+1], dp2[i)를 사용하여 반복적으로 계산됩니다. +2] + 스티커[i]).

6. 마지막으로 최대 포인트 값은 dp1[n-2] 및 dp2[1]의 최대값이며, 여기서 n은 sticker의 길이입니다. -2 및 1 인덱스는 dp1의 마지막 요소가 끝에서 두 번째 스티커에 해당하고 dp2의 첫 번째 요소가 두 번째 스티커에 해당하기 때문에 사용됩니다.

 

반응형