[다이나믹 프로그래밍] 백준 실버3 2579번: 계단 오르기(Swift)

2023. 5. 22. 17:46·코테

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

 

2579번: 계단 오르기

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

www.acmicpc.net

풀이과정

문제를 정리하면,

계단마다 점수가 있다.

계단은 1칸 혹은 2칸씩 오를 수 있다.

하지만, 연속된 세 개의 계단을 모두 밟을 수는 없다.

이때 얻을 수 있는 점수의 최댓값을 구해야 한다.

중요한 키워드만 정리해 보았다.

해당 문제는 DP를 활용하여 풀 수 있다.

각 계단을 올랐을 때 포인트의 최댓값을 알고 있으면 해당 포인트에 앞으로 오를 계단의 포인트를 더해주면 해결할 수 있다.

계단 수가 1번부터 3번까지는 직접 계산할 수 있다.

dp[1] = points[1]
dp[2] = points[1] + points[2]
dp[3] = max(points[1] + points[3], points[2] + points[3])

4번째 계단의 경우,

1번 -> 3번 -> 4번 경우와 // 1번 케이스

1번 -> 2번 -> 4번의 경우가 있다 // 2번 케이스

1번 케이스의 경우 1번 계단까지 도달한 점수 + 3번, 4번 계단의 점수를 계산해 주면 된다.

2번 케이스의 경우 1과 2가 연속되었기 때문에 2번 계단까지 도달한 점수 + 4번 계단의 점수를 계산해 주면 된다.

이제 이를 코드로 작성해 보면

let n = Int(readLine()!)!

var points: [Int] = [0]
var dp = Array(repeating: 0, count: n + 1)

for _ in 0..<n {
  let point = Int(readLine()!)!
  points.append(point)
}

if n == 1 {
  print(points[1])
} else if n == 2 {
  print(points[1] + points[2])
} else if n == 3 {
  let result = max(points[1] + points[3], points[2] + points[3])
  print(result)
} else {
  dp[1] = points[1]
  dp[2] = points[1] + points[2]
  dp[3] = max(points[1] + points[3], points[2] + points[3])
  
  for i in 4...n {
    dp[i] = max(points[i] + points[i-1] + dp[i-3], points[i] + dp[i-2])
  }
  print(dp[n])
}

 

위와 같이 코드로 작성할 수 있다.

저작자표시 (새창열림)

'코테' 카테고리의 다른 글

[다이나믹 프로그래밍 + 구현] 백준 실버3 14501번: 퇴사(Swift)  (0) 2023.05.24
[DFS] 백준 실버1 11403번: 경로 찾기(Swift)  (0) 2023.05.23
[분할정복 + 재귀] 백준 실버1 1629번: 곱셈(Swift)  (0) 2023.05.22
[그리디] 백준 실버4 11047번: 동전 0(Swift)  (0) 2023.05.19
[이분 탐색] 백준 실버3 2512번: 예산(Swift)  (0) 2023.05.18
'코테' 카테고리의 다른 글
  • [다이나믹 프로그래밍 + 구현] 백준 실버3 14501번: 퇴사(Swift)
  • [DFS] 백준 실버1 11403번: 경로 찾기(Swift)
  • [분할정복 + 재귀] 백준 실버1 1629번: 곱셈(Swift)
  • [그리디] 백준 실버4 11047번: 동전 0(Swift)
Esiwon
Esiwon
iOS 개발 블로그
  • Esiwon
    시원한 코드 기록
    Esiwon
  • 전체
    오늘
    어제
    • 분류 전체보기 (70)
      • iOS&Swift (24)
      • git & github (1)
      • 코테 (41)
      • 네부캠 회고 (4)
  • 블로그 메뉴

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

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    비동기
    Race Condition
    GCD
    알고리즘
    dfs
    Combine
    Property wrapper
    재귀
    photoUI
    회고
    탐색
    동시성
    Swift
    브루트포스 알고리즘
    코딩테스트
    네부캠
    챌린지
    photos
    코테
    다이나믹 프로그래밍
    노드
    BFS
    그리디
    PhotoKit
    완전탐색
    실버
    백준
    구현
    ios
    이분탐색
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Esiwon
[다이나믹 프로그래밍] 백준 실버3 2579번: 계단 오르기(Swift)
상단으로

티스토리툴바