스티커 모으기(2)
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
내 풀이
- 첫번째 값을 선택하는 경우/ 선택 안하는 경우로 구분
- 첫번째 값 선택하는 경우 → 마지막 값은 선택 할 수 없음
- i번째 값 선택할지 말지로 dp진행
- i 값 선택하는 경우
- i-1 선택 못하고 i-2는 선택해도 되고 안해도 되고
- max(dp[i-2])+sticker[i]
- i 값 선택 안하는 경우
- i-1값 선택해도 되고 안해도 되고
- max(dp[i-1])
- i 값 선택하는 경우
- 마지막 값 선택 안 하는 경우로 선택
- max(answer,dp[n][1])
- i번째 값 선택할지 말지로 dp진행
- 첫번째 값 선택 안하는 경우 → 마지막 값 선택 해도 되고 안해도 됨
- dp 진행한 뒤에 마지막 값은 둘 중에 최댓값 선택
- max(answer,max(dp[n]))
- dp 진행한 뒤에 마지막 값은 둘 중에 최댓값 선택
def solution(sticker):
answer = 0
n=len(sticker)
sticker=[0]+sticker
if n<=2:
return max(sticker)
for j in range(2):
dp=[[-float('inf') for _ in range(2)] for _ in range(n+1)]
dp[0][0]=0
dp[0][1]=0
if j==0:
dp[1][j]=sticker[1]
else:
dp[1][j]=0
for i in range(2,n+1):
dp[i][0]=max(dp[i-2])+sticker[i]
dp[i][1]=max(dp[i-1])
if j==0:
answer=max(answer,dp[n][1])
else:
answer=max(answer,max(dp[n]))
return answer
다른 사람 풀이
- 1번 선택하는 경우
- 1 ~ n-1번 배열만 확인
- dp1 = [0] + sticker[:-1]
- 2번 선택하는 경우
- 2 ~ n번 배열만 확인
- dp1 = [0] + sticker[1:]
def solution(sticker):
answer = 0
if len(sticker) == 1:
return sticker.pop()
size = len(sticker)
# 1번 선택하는 경우 -> 1..n-1번 배열에 대한 DP
dp1 = [0] + sticker[:-1]
for i in range(2, size):
dp1[i] = max(dp1[i-1], dp1[i-2] + dp1[i])
# 2번 선택하는 경우 -> 2...n번 배열에 대한 DP
dp2 = [0] + sticker[1:]
for i in range(2, size):
dp2[i] = max(dp2[i-1], dp2[i-2] + dp2[i])
answer = max(dp1[-1], dp2[-1])
return answer
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스][누적합][imos] 파괴되지 않은 건물 (0) | 2025.03.19 |
|---|---|
| [프로그래머스][DFS] 양궁대회 (0) | 2025.03.18 |
| [프로그래머스][구현] 주차 요금 계산 (0) | 2025.03.03 |
| [프로그래머스][구현] 당구 연습 (0) | 2025.02.22 |
| [프로그래머스][약수,배수][DP] 억억단을 외우자 (0) | 2025.02.20 |