[BaekJoon] 백준 2579번 : 계단 오르기

Updated:

2579번 : 계단 오르기

stair1
stair2


처음 문제를 풀 때는 마지막 계단은 무조건 밟아야 하니 거꾸로 마지막 계단을 밟고 시작해 바닥으로 내려가는 식으로 접근했다.

그리고 한 칸을 내려간 경우, 두 칸을 내려간 경우를 비교 해 큰 값이 있는 계단으로 내려갔다.

이 때 한 칸을 내려간 경우는 다음에 한 칸을 또 내려갈 수 없으니 무조건 두 칸을 또 내려가게 해두었다.

이런식으로 접근을 했었는데 같은 값이 연속으로 올 때 등 맞지 않는 부분이 엄청 많았다..

어떤 알고리즘을 사용해야 하는지만 살짝 봤는데 DP 를 활용하면 풀 수 있는 문제이다.

DP 를 사용하는 문제를 풀어 본 적이 있어서 계속 풀이를 생각해 보았는데 연속 된 세 개의 계단을 밟으면 안되는 조건이 너무 어려웠다.

다른 사람들의 풀이를 보고 이해를 할 수 있었다.. 어떻게 바로 이런 생각을 할 수 있을까 대단하군..

일단 첫 번째, 두 번째, 세 번째 계단 까지의 최댓값은 식을 통해 구할 수 있다.

이 다음부터 DP 를 사용하면 되는데 한 칸 뒤에서 올라온 경우와 두 칸 뒤에서 올라온 경우를 구해 더 큰 값을 가지면 된다.

만약 내가 한 칸 뒤에서 올라온 경우현재 계단 점수, 한 칸 뒤 계단 점수, DP[세 칸 뒤 계단] 점수를 더한다.

두 칸 뒤에서 올라온 경우현재 계단 점수, DP[두 칸 뒤 계단] 점수를 더한다.

처음에 이해하기가 어려웠는데 이해하고 보면 생각보다 나쁘지 않게 풀 수 있을 것 만 같은 기분이다.

DP 관련 문제를 많이 풀어서 이런 느낌을 계속 접해봐야 할 것 같다.


import sys


def find_max_score(stairs):
	if len(stairs) == 1:
		return stairs[0]

	if len(stairs) == 2:
		return stairs[0] + stairs[1]

	if len(stairs) == 3:
		return max(stairs[0] + stairs[2], stairs[1] + stairs[2])

	dp = list()
	dp.append(stairs[0])
	dp.append(stairs[0] + stairs[1])
	dp.append(max(stairs[0] + stairs[2], stairs[1] + stairs[2]))

	for i in range(3, len(stairs)):
		dp.append(max(stairs[i] + stairs[i - 1] + dp[i - 3], stairs[i] + dp[i - 2]))

	return dp[-1]


N = int(input())
_stairs = [int(sys.stdin.readline().rsplit()[0]) for _ in range(N)]
print(find_max_score(_stairs))

Categories:

Updated:

Leave a comment