300x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 파이썬
- 리눅스
- AI
- 백준
- 운영체제
- nlp
- dp
- CSS
- google coding competition
- 그래프
- 브루트포스
- OS
- 코딩 테스트
- 코딩
- DFS
- 구글 킥스타트
- 코딩테스트
- kick start
- 동적 프로그래밍
- 동적프로그래밍
- 딥러닝
- 순열
- BFS
- PYTHON
- 알고리즘
- linux
- 킥스타트
- 프로그래머스
- 프로그래밍
- 네트워크
Archives
- Today
- Total
오뚝이개발자
스티커 모으기 2 본문
728x90
300x250
문제
https://programmers.co.kr/learn/courses/30/lessons/12971
나의 풀이
dp를 사용하면 되는 문제이다. 케이스는 두 가지이다. 첫 번째 스티커를 사용하는 경우와 사용하지 않는 경우이다. 따라서 dp1,dp2 두 개의 dp 배열을 만들어 저장하면 된다.
dp1의 경우 첫 번째 스티커를 사용하므로 dp1[0] = sticker[0], dp1[1] = dp1[0]이다. dp2의 경우 첫 번째 스티커를 사용하지 않으므로 dp2[0] = 0, dp2[1] = sticker[1]이다.
dp[i] = max(dp[i-1], dp[i-2]+sticker[i])의 식으로 dp를 갱신한 뒤 마지막에 max(max(dp1), max(dp2))를 return 해주면 된다.
코드
def solution(sticker):
if len(sticker)==1:
return sticker[0]
dp1 = [0 for _ in range(len(sticker))] # use first sticker
dp2 = [0 for _ in range(len(sticker))] # unuse first sticker
dp1[0] = sticker[0]
dp1[1] = dp1[0]
dp2[1] = sticker[1]
for i in range(2,len(sticker)-1):
dp1[i] = max(dp1[i-1], dp1[i-2]+sticker[i])
for i in range(2,len(sticker)):
dp2[i] = max(dp2[i-1], dp2[i-2]+sticker[i])
return max(max(dp1),max(dp2))
728x90
300x250
Comments