문제 링크
https://programmers.co.kr/learn/courses/30/lessons/12971
코딩테스트 연습 - 스티커 모으기(2)
N개의 스티커가 원형으로 연결되어 있습니다. 다음 그림은 N = 8인 경우의 예시입니다. 원형으로 연결된 스티커에서 몇 장의 스티커를 뜯어내어 뜯어낸 스티커에 적힌 숫자의 합이 최대가 되도록
programmers.co.kr
풀이 - 다른 블로그 참고
- 처음에는 그리디 문제로 접근했는데, 다이나믹 프로그래밍 문제였다.
- result[i]를 sticker에서 i번째 인덱스까지 더했을 때의 최댓값
- 점화식 : result[i] = max(result[i-1], result[i-2] + sticker[i])
- i-1번 인덱스의 스티커를 뗐을 경우, i번째 스티커는 뗄 수 없으므로 result[i] = result[i-1]
- i-1번 인덱스의 스티커를 떼지 않았을 경우, result[i] = result[i-2] + sticker[i]
- 첫번째 스티커를 떼는 여부에 따라 두가지로 나눔
- 떼는 경우, result[0] = sticker[0], result[1] = sticker[0]이며 마지막 인덱스는 확인하면 안된다.
- 떼지 않는 경우, result[0] = 0 , result[1] = sticker[1]이며 마지막 인덱스까지 확인한다.
def solution(sticker):
answer = 0
if len(sticker) == 1 :
return sticker[0]
# result[i]는 index i번째까지 sticker에서 얻을 수 있는 최댓값
# 첫번째 스티커 때는 경우
# 마지막 인덱스 검사하면 안됨
result = [ 0 for _ in range(len(sticker))]
result[0] = sticker[0]
result[1] = sticker[0]
for i in range(2, len(sticker)-1):
result[i] = max(result[i-1], result[i-2] + sticker[i])
answer = max(result)
# 첫번째 스티커를 안 때는 경우
# 마지막 인덱스까지 검사
result = [ 0 for _ in range(len(sticker))]
result[0] = 0
result[1] = sticker[1]
for i in range(2, len(sticker)):
result[i] = max(result[i-1], result[i-2] + sticker[i])
return max(answer,max(result))
'개발 > algorithm' 카테고리의 다른 글
[프로그래머스][level3] 최고의 집합 -python (0) | 2022.01.13 |
---|---|
[프로그래머스][level3] 멀리 뛰기 -python (0) | 2022.01.13 |
[프로그래머스][level3] 숫자 게임 -python (0) | 2022.01.11 |
[프로그래머스][level3] 기지국 설치 -python (0) | 2022.01.11 |
[프로그래머스][level3] 가장 긴 팰린드롬 - python (0) | 2022.01.11 |