본문 바로가기

Algorithm/BOJ

[BOJ] 2579. 계단 오르기

https://www.acmicpc.net/problem/2579

 

2579번: 계단 오르기

계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점

www.acmicpc.net

 

 

1. 해결방법

"""
1. 아이디어
- 첫 번째 계단의 값을 초기 값을 result에 append
- 두 번째와 첫번째의 합, 두 번째를 비교해서 큰 값을 result에 append
- 세 번째는 첫 번째와 세 번째 합, 두 번째와 세 번째의 합을 비교해서 큰 값을 result에 append
- 3번째 부터 n번째 까지 for문을 돌린다.
- 네 번째는 네 번째 인덱스와 result[i-2]의 합과 네 번째 인덱스와 세 번째 인덱스, result[i-3]의 합을 비교해서 큰 값을 result에 append
- 네 번째 인덱스부터는 앞의 인덱스를 더한 값을 가정해야하기 때문에 result의 인덱스를 활용해서 max 연산자로 비교함.
- n이 1 or 2일 때는 for문을 돌렸을 때 런타임에러가 뜨기 때문에 예외 처리

2. 시간복잡도
- O(N)
"""

 

 

2. 정답코드

import sys
input = sys.stdin.readline

n = int(input())
nums = list(int(input()) for _ in range(n))

add_v = 0
result = []

if n >= 3:
    result.append(nums[0])
    result.append(nums[1] + nums[0])
    result.append(max((nums[2] + nums[1]), (nums[2] + nums[0])))

    for i in range(3, n):
        # 3번째 조건
        if i == n:
            result.append(result[i - 1] + nums[i])
        # 1, 2번째 조건
        else:
            result.append(max(nums[i] + result[i - 2], nums[i] + nums[i - 1] + result[i - 3]))

    print(result.pop())

elif n == 2:
    print(max(nums[1] + nums[0], nums[1]))
elif n == 1:
    print(nums[0])
DP문제이며 본인은 개인적으로 어려웠다.
생각을 꽤 깊이 한 문제이며, 특히나 계단의 합을 result로 append 하는것에서 많이 막힌 것 같다.

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 1922. 네트워크 연결  (0) 2022.09.07
[BOJ] 1197. 최소 스패닝 트리  (0) 2022.09.07
[BOJ] 1003. 피보나치 함수  (0) 2022.09.07
[BOJ] 9095. 1, 2, 3 더하기  (0) 2022.09.06
[BOJ] 11726. 2×n 타일링  (0) 2022.09.06