일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- html
- JPA
- Loss Function
- skt fellowship 3기
- 코드업
- 졸프
- google cloud
- matplotlib
- 커스텀 데이터 학습
- javascript
- react native
- yolo
- @Transactional
- AWS
- oauth
- Spring
- Expo
- pandas
- marksense.ai
- 순환참조
- google login
- idToken
- C++
- 2021 제9회 문화공공데이터 활용경진대회
- Spring Boot
- OG tag
- google 로그인
- STT
- YOLOv5
- 양방향 매핑
Archives
- Today
- Total
민팽로그
[백준 / BOJ] 2579번: 계단 오르기 본문
https://www.acmicpc.net/problem/2579
2579번: 계단 오르기
계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점
www.acmicpc.net
코드
1. 재귀호출 사용
#include <cstdio>
#include <algorithm>
using namespace std;
int n, stair[301];
int res[301] = {};
int upstair(int num) {
if (num == 2) return stair[1] + stair[2];
if (num < 2) return stair[num];
if(!res[num]) res[num] = max(upstair(num - 3) + stair[num - 1], upstair(num - 2)) + stair[num];
return res[num];
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &stair[i]);
printf("%d", upstair(n));
return 0;
}
2. 반복문 사용
#include <iostream>
#include <algorithm>
using namespace std;
int n, stair[301];
int res[301] = {};
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 1; i <= n; i++) cin >> stair[i];
res[1] = stair[1]; res[2] = stair[1] + stair[2];
for (int i = 3; i <= n; i++) {
res[i] = max(stair[i - 1] + res[i - 3], res[i - 2]) + stair[i];
}
cout << res[n];
return 0;
}
마지막 계단은 무조건 밟아야 하며, 3개의 계단을 연속해서 밟을 수 없다. i번째 계단을 밟는 방법에 대한 경우는 다음과 같이 나눌 수 있다.
- i-3번째 계단을 밟고, i-1번째 계단과 i번째 계단을 밟는다. -> i번째 계단과 i-1번째 계단을 연속으로 밟았을 경우이며, i-2번째 계단은 밟을 수 없으므로 건너 뛰고 i-3번째 계단을 밟을 수 있다.
- i-2번째 계단을 밟고, i번째 계단을 밟는다.
경우를 나누었으면, i번째 계단까지 밟았을 때, 점수가 최대가 되는 값인 dp[i]을 구한다.
- 첫번째 경우에 대해: 점수의 최댓값 dp[i] = (i-3번째 계단까지 밟았을 때 점수의 최대값) + (i-1번 계단의 점수) + (i번 계단의 점수) = dp[i-3] + stair[i-1] + stair[i]
- 두번째 경우에 대해: 점수의 최댓값 dp[i] = (i-2번째 계단까지 밟았을 때 점수의 최댓값) + (i번 계단의 점수) = dp[i-2] + stair[i]
따라서 dp[i]는 dp[i-3] + stair[i-1] + stair[i] 와 dp[i-2] + stair[i] 중 더 큰 값을 취하면 된다.
'PS > 백준📖' 카테고리의 다른 글
[백준 / BOJ] 10844번: 쉬운 계단 수 (0) | 2021.12.11 |
---|---|
[백준 / BOJ] 1463번: 1로 만들기 (0) | 2021.12.11 |
[백준 / BOJ] 1932번: 정수 삼각형 (0) | 2021.12.06 |
[백준 / BOJ] 1149번: RGB거리 (0) | 2021.12.06 |
[백준 / BOJ] 9461번: 파도반 수열 (0) | 2021.12.04 |
Comments