https://www.acmicpc.net/problem/2579
2579번: 계단 오르기
계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점
www.acmicpc.net
계단을 두칸씩 오르면 무릎에 안좋다.
문제 접근
dp를 활용하는 문제.
0,1,2는 하드코딩을 해야한다.
이중 2는 이렇게 계산하면 된다.
시작에서 2칸을 바로 건너도 된다는 사실을 몰라서 이부분에서 오래걸렸다...
그 이후인 3부터는 1칸씩 반복계산하면 된다.
3부터 현재위치가 2칸건너 1칸으로 온 경우와 2칸만에 온 경우를 비교해야한다.
이부분도 상당히 시간을 잡아먹었는데, 2칸건너 1칸을 온 경우더라도 다음연산에 지장이 없다.
우측사진에서 보면 한칸만에 오던 두칸만에 오던, 2칸을 건넌다면 생각안해도 되니 파란색은 무시해도 된다.
빨간색만 생각하면 쉽게 풀린다.
이렇게 하면 마지막계단을 포함하면서 풀 수 있다.
문제 풀면서 쓴 주석
"""
2579 계단 오르기
1. 0,1,2에 대해 계산함
2. i번째가 2칸을 건너온곳인지 2칸후 1칸을 건너온곳인지 비교. -> N번 반복
"""
코드
from collections import deque
import sys
input = sys.stdin.readline
"""
2579 계단 오르기
1. 0,1,2에 대해 계산함
2. i번째가 2칸을 건너온곳인지 2칸후 1칸을 건너온곳인지 비교. -> N번 반복
"""
#입력
N = int(input())
arr=[]
dp = []
for i in range(N):
arr.append(int(input()))
if N>2:
#하드코딩 0, 1, 2
dp.append(arr[0])
dp.append(arr[0]+arr[1])
dp.append(max(arr[0]+arr[2],arr[1]+arr[2]))
#dp반복
for i in range(3,N):
dp.append(max(dp[i-3]+arr[i-1]+arr[i],dp[i-2]+arr[i]))
#출력
print(dp[-1])
else:
print(sum(arr))
88ms
dp는 어렵다...
'백준 > 문제풀이_python' 카테고리의 다른 글
1932 정수 삼각형 _python (0) | 2022.11.10 |
---|---|
9184 신나는 함수 실행 _python (0) | 2022.11.09 |
17202 핸드폰 번호 궁합 _python (0) | 2022.11.08 |
1012 유기농 배추 _python (0) | 2022.11.08 |
1748 피보나치 수 2 _python (0) | 2022.11.08 |
댓글