반응형
1. 문제
계단에 쓰여 있는 점수가 주어질 때 점수의 최댓값 구하기
1. 한 번에 한 계단씩 또는 두 계단씩 오를 수 있다
2. 연속된 세 개의 계단을 모두 밟아서는 안 된다
3. 마지막 도착 계단은 반드시 밟아야 한다
2. 요구 사항
* 계단의 개수는 300 이하의 자연수
* 계단에 쓰여 있는 점수는 10,000 이하의 자연수
3. 알고리즘 분류
* 다이나믹 프로그래밍
4. 접근 방식
계단을 올라가는 것만 생각하지 말고, 이미 올라간 상태에서
이전에 내가 어떤 계단을 밟고 올라올지를 생각하는 방식으로 접근한다
1) 직전 계단 (n-1) 을 밟고 올라온 경우는
세번 연속 계단을 오를 수 없으므로 그 이전 계단은 n-3 번째 계단이다
2) 두 칸 전 (n-2) 계단을 밟고 올라온 경우
i 번째 계단까지 올라왔을 때까지의 최대 값을 dp[i] 이라고 두고
각 계단의 점수는 stair[i] 으로 두고 계산한다
첫번째 경우는 dp[i-3] + stair[i-1] + stair[i]
두번째 경우는 dp[i-2] + stair[i]
5. 전체 코드
# 계단에 쓰여 있는 점수가 주어질 때 점수의 최댓값 구하기
# 1. 한 번에 한 계단 또는 두 계단씩 오를 수 있다
# 2. 연속된 세 개의 계단을 모두 밟아서는 안 된다
# 3. 마지막 도착 계단은 반드시 밟아야 한다
# 직전 계단을 밟고 올라온 경우 그 이전 계단은 n-3 번째
# dp[i-3] + stairs[i-1] + stairs[i]
# 두 칸 전 계단을 밟고 올라온 경우
# dp[i-2] + stairs[i]
n = int(input())
stairs = [0] * 301 # 계단 점수를 저장하는 배열
dp = [0] * 301 # 누적 최대값을 저장하는 배열
for i in range(1, n+1):
stairs[i] = int(input()) # 점수 입력 받기
# 계단이 두 개 밖에 없는 경우 두 개 다 밟아야 하니
# n 이 1 과 2 일 때 기본값 생성
dp[1] = stairs[1]
if n > 1:
dp[2] = stairs[1] + stairs[2]
for i in range(3, n+1):
dp[i] = max(dp[i-3]+stairs[i-1]+stairs[i], dp[i-2]+stairs[i])
print(dp[n])
반응형
'알고리즘' 카테고리의 다른 글
[백준] 12865 아주 평범한 배낭 Python (1) | 2024.10.02 |
---|---|
[백준] 9251 LCS Python (1) | 2024.09.30 |
[백준] 11726 2xn 타일 Python (0) | 2024.09.29 |
[백준] 1904 01타일 Python (1) | 2024.09.28 |
[백준] 2748 피보나치2 Python (1) | 2024.09.28 |