문제 주소 : www.acmicpc.net/problem/2579
정답 비율 : 35.262% (2021.05.04 17:31 기준)
2579번: 계단 오르기
계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점
www.acmicpc.net
문제 요약 :
평지에서 N개의 계단을 오를 예정입니다. 이때 다음과 같은 조건이 걸립니다.
1. 한 번에 한 칸 또는 두 칸의 계단을 오를 수 있습니다.
2. 연속된 세 칸의 계단은 밟을 수 없습니다.
3. 마지막 계단은 반드시 밟아야합니다.
문제 조건 :
입력 : 계단의 개수 N이 주어집니다. 이어서 N개의 계단의 점수가 주어집니다. ( N : 1 ~ 300, 점수 : 1 ~ 10000 )
출력 : 계단 올라갔을 때 얻을 수 있는 최대 점수를 출력하시오.
시간 : 1초
문제 풀이 :
문제를 읽으면 가장 먼저 떠오르는 것은 DP를 사용하는 것입니다.
(간단하다고 생각했지만 점화식 구하기 힘들었습니다.)
DP[i]는 i번째 계단을 마지막 계단이라고 가정했을 때 얻을 수 있는 최대 점수를 의미합니다. i번째 계단을 밝을 수 있는 방법은 i - 1 또는 i - 2에서 밟을 수 있습니다. 이때 i - 2에서 i번째 계단을 밟을 때 연속 세 칸에 대해서 별도로 고민하지 않아도 됩니다. 하지만 i - 1에서 i번째 계단을 밟을 때 연속 세 칸을 신경 써야 합니다.
이를 바탕으로 다음과 같은 점화식을 세울 수 있습니다.
i < 3
DP[0] = stair[0];
DP[1] = stair[0] + stair[1];
DP[2] = stair[0] + stair[2] 와 stair[1] + stair[2] 중 더 큰 값에 해당합니다.
i >= 3
DP[i] = stair[i] + stair[i - 1] + DP[i - 3] 또는 stair[i] + DP[i - 2] 중 더 큰 값이 되겠습니다.
코드는 다음과 같습니다.
Python3
# solve 1920
size = int(input())
stair = [int(input()) for i in range(size)] + [0, 0]
DP = [0 for i in range(size + 2)]
DP[0] = stair[0]
DP[1] = stair[0] + stair[1]
DP[2] = max(stair[0], stair[1]) + stair[2]
for i in range(3, size):
DP[i] = max(DP[i - 2], stair[i - 1] + DP[i - 3]) + stair[i]
print(DP[size - 1])
-> stair과 DP에 각각 size + 2 만큼 만든 이유는 아래 DP[2] 형식으로 무조건적으로 접근하기 때문입니다. size 1 또는 2가 주어진 경우에는 컴파일 에러가 발생하는 것을 방지 위함입니다.
'Algorithm Trainning > 백준 알고리즘(BEAKJOON)' 카테고리의 다른 글
| 백준 : 8980번, 택배 (0) | 2021.06.27 |
|---|---|
| 백준 : 11399번, ATM (0) | 2021.06.26 |
| 백준 : 1316번, 그룹 단어 체커 (0) | 2021.05.02 |
| 백준 : 2667번, 단지번호붙이기 (0) | 2021.05.02 |
| 백준 : 1920번, 수 찾기 (0) | 2021.04.29 |