Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 플로이드-워셜
- GROUP BY
- 투포인터
- 다이나믹프로그래밍
- 해시
- 우선순위큐
- 트리
- join
- 그래프 탐색
- 브루트포스
- DP
- 서브쿼리
- 구현
- 다시
- 분할정복
- 재귀
- 백트래킹
- 누적합
- 그리디
- 수학
- 다익스트라
- 자료구조
- BFS
- 에라토스테네스의 체
- 그래프 이론
- MST
- 시뮬레이션
- 크루스칼
- 다이나믹 프로그래밍
- DFS
Archives
- Today
- Total
기록하고 까먹지 말기
2579 본문
날짜 : 2022. 11. 13
사용 언어 : python
문제
코드
import sys
n = int(sys.stdin.readline())
s = [] # 계단에 쓰여진 숫자
dp = [0] * 301 # 해당 자리까지의 점수의 최댓값
for _ in range(n): s.append(int(sys.stdin.readline()))
if n == 1: print(s[0])
elif n == 2: print(s[0]+s[1])
else:
dp[0] = s[0] # 0인 경우 해당 칸만 적용
dp[1] = s[0] + s[1] # 1인 경우 0, 1만 적용
for i in range(2, n):
dp[i] = max(dp[i - 2] + s[i], dp[i - 3] + s[i - 1] + s[i]) # 1칸 이동해서 도착한 경우와 2칸 이동해서 도착한 경우 비교
print(dp[n - 1])
#print(dp[:n]) # 디버깅
풀이
- 가장 마지막 자리에서부터 역순으로 시작해서 풀이하려고 했지만 너무 복잡해서 고민끝에 다른 풀이들을 참고했다.
- 처음부터 시작하되, n값이 3이상인 케이스부터는 for문을 통해 다이나믹 프로그래밍을 이용해서 문제를 해결하는 방식이었다.
- 먼저 첫번째, 두번째의 경우는 주석처럼 풀이하면 되고, 3번째부터는 해당 칸까지 한 칸을 이동했을 경우와 두 칸을 이동했을 경우를 서로 비교해서 최댓값을 설정해 주면 된다.
알게된 점
- 여기서 dp[i] = max(dp[i - 2] + s[i], dp[i - 3] + s[i - 1] + s[i]) 를 확실하게 이해하지 못해 꽤 많은 고민을 했었다.
- 그리고 dp를 통해 이전값들을 저장하는 방식 또한 곧바로 떠올리지 못했다는 것이 아쉬웠다.
- 오는 주차에는 다이나믹 프로그래밍 문제를 좀 많이 풀어보아야겠다.
참고 사이트
-
'전공 > 백준' 카테고리의 다른 글
DP 응용문제(이코테) - 2 (0) | 2022.11.15 |
---|---|
DP 응용문제(이코테) - 1 (0) | 2022.11.15 |
2470 (0) | 2022.11.12 |
3273 (0) | 2022.11.12 |
15904 (0) | 2022.11.12 |