[백준/Python] 2579번 계단 오르기

2025. 2. 14. 14:23·알고리즘문제풀이

문제

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


문제이해

이 문제는 딱 보자마자 다이나믹 프로그래밍을 이용해서 풀어야 하는구나 생각했다.

 

아래의 조건을 살펴보았다.

  1. 계단은 한 번에 한 계단씩 또는 두 계단씩 오를 수 있다.
  2. 연속된 세 개의 계단을 모두 밟아서는 안 된다.
  3. 마지막 도착 계단은 반드시 밟아야 한다.

마지막 3번째 조건은 마지막 계단을 무조건 밟아야 한다는 것이니 마지막 계단부터 계산을 하면 점화식을 세울 수 있을 것이라 생각했다.


점화식

  • 바로 직전 계단을 밟을 때
    • dp[i] = stairs[i] + stairs[i-1] + dp[i-3]
  • 전 전 계단을 밟을 때
    • dp[i] = stairs[i] + dp[i-2]

바로 직전 계단을 밟을 경우,

계단 세 개를 연속으로 밟을 수 없으므로 현재 계단 + 직전 계단 + (i-3)번째 까지의 최댓값 점화식을 세우고

 

전 전 계단을 밟을 경우,

현재 계단 + (i-2)번째 까지의 최댓값 점화식을 세우면 된다.

 

2가지 경우 중 최댓값을 선택하는 점화식을 세우면 이 문제를 풀 수 있다.


정답

n = int(input())
dp = [0] * (n+1)
stairs = [0] * (n+1)

for i in range(1,n+1):
    stairs[i] = int(input())

    dp[i] = max(dp[i-2] + stairs[i], dp[i-3] + stairs[i-1] + stairs[i])

print(dp[-1])
저작자표시 비영리 변경금지 (새창열림)

'알고리즘문제풀이' 카테고리의 다른 글

[백준/Python] 1697번 숨바꼭질  (0) 2025.02.18
[백준/Python] 1260번 DFS와 BFS  (0) 2025.02.17
[프로그래머스/Python] 실패율  (0) 2025.02.13
[백준/Python] 1002번 터렛  (0) 2025.02.12
[백준/Python] 2805번 나무 자르기  (0) 2025.02.11
'알고리즘문제풀이' 카테고리의 다른 글
  • [백준/Python] 1697번 숨바꼭질
  • [백준/Python] 1260번 DFS와 BFS
  • [프로그래머스/Python] 실패율
  • [백준/Python] 1002번 터렛
jungyn
jungyn
jungyn 님의 블로그 입니다.
  • jungyn
    jungyn 님의 블로그
    jungyn
  • 전체
    오늘
    어제
    • 분류 전체보기 (36)
      • 알고리즘문제풀이 (31)
      • 제로인턴 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    2차원행렬
    2606
    counter
    2161
    1629
    2108
    수들의 합 2
    스택 수열
    교점개수
    스택 2
    사전직무교육
    카드1
    다이나믹프로그래밍
    시간초과
    1847
    28278
    DP
    SYS
    11729
    2563
    스택
    백준
    프로그래머스
    제로인턴
    후기
    통계헉
    18110
    solved.ac
    BFS
    너비우선탐색
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
jungyn
[백준/Python] 2579번 계단 오르기
상단으로

티스토리툴바