공부하고 기록하는, 경제학과 출신 개발자의 노트

프로그래밍/코딩테스트 문제풀이

[Python] 프로그래머스. 스티커 모으기(2) (Level 4)

inspirit941 2020. 1. 18. 14:09
반응형

https://programmers.co.kr/learn/courses/30/lessons/12971

 

코딩테스트 연습 - 스티커 모으기(2) | 프로그래머스

N개의 스티커가 원형으로 연결되어 있습니다. 다음 그림은 N = 8인 경우의 예시입니다. 원형으로 연결된 스티커에서 몇 장의 스티커를 뜯어내어 뜯어낸 스티커에 적힌 숫자의 합이 최대가 되도록 하고 싶습니다. 단 스티커 한 장을 뜯어내면 양쪽으로 인접해있는 스티커는 찢어져서 사용할 수 없게 됩니다. 예를 들어 위 그림에서 14가 적힌 스티커를 뜯으면 인접해있는 10, 6이 적힌 스티커는 사용할 수 없습니다. 스티커에 적힌 숫자가 배열 형태로 주어질 때, 스

programmers.co.kr

DP문제. 점화식을 어떻게 세워야 하는지 도저히 모르겠어서 풀이를 참고했다.

 

table[i] = i번째 index까지의 배열에서 얻을 수 있는 최댓값이라고 정의하면

1) 만약 i-1번 index의 스티커를 뗐을 경우 = i번째 index 스티커는 뗄 수 없다. 즉 table[i-1]값 그대로

2) i-1번 스티커를 떼지 않았을 경우 = i-2번까지의 최댓값 + i번째 스티커의 값

이 된다.

 

즉 table[i] = max(table[i-1], table[i-2] + sticker[i]) 가 점화식이 된다.

 

여기서, 첫 번째 스티커를 떼느냐 아니냐가 마지막 index 스티커의 여부를 결정한다.

 

만약 첫 번째 스티커를 떼는 경우

table[0] = sticker[0], table[1] = sticker[0]이 되며, 마지막 index는 확인해서는 안 된다.

첫 번째 스티커를 떼지 않으면

table[0] = 0, table[1] = sticker[1]이 되며, 마지막 index까지 확인해야 한다.

 

코드로 정리하면

 

 

반응형