

dfs 사용해서
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
| start | 10 | 20 | 15 | 25 | 10 | 20 |
계단을 이런식으로 입력해놓고
| 1 | 2 | ||||
| 2 | 3 | 3 | 4 | ||
| 4 | 4 | 5 | 4 | 5 | 6 |
| 6 | 6 | 6 | 6 | 6 | |
이렇게 dfs를 실행해보고 싶었슨...
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void stairs(vector<int>v, int&ans, int num, int cnt, int i){
num += v[i];
// cout << ans << "**" << num << "**" << cnt << "**" << i << "\n"; 흐름파악용
if(i==v.size()) {
ans = max (ans, num);
return;
} // 계단 맨 끝에 가면 종료
if(i == v.size()-1){
if(cnt!=2) stairs(v, ans, num, cnt+1, i+1); // 한칸 올라가기
return; // 맨 끝에 못다다르면 종료
}
if(cnt != 2) stairs(v, ans, num, cnt+1, i+1); // 연속 3칸 아닐 때는 1개 오르기 가능
stairs(v, ans, num, 1, i+2); // 두칸 올라가기
}
int main(){
int N;
cin >> N;
vector <int> v(N+1,0);
for(int i =1; i<= N; ++i) cin >> v[i];
int ans = 0;
stairs(v, ans, 0, 0, 0);
cout << ans;
}
그래서 구현한게 이건데 시간초과 나와서 다른 조금 더 효율적인 방법을 고민해보기로
뭔가 이것도 데이터 더하고 하는게 반복되는거같아서
dp로 구현하는걸 문제에서 원하는 것 같음
그래서 dp로 구현하려는데 연달아서 3칸 못올라가는거 때문에 고민...
두칸 점프하는거는 dp[i-2]+v[i]로 하면 될거같은데
연달아 올라가는거는 바로 앞에 값 더하면 세칸 연달아가 될 수도 있으니까
무조건 점프+연달아로 실행이 되어야한다는 점을 활용해서
dp[i-3]+v[i-1]+v[i]
이렇게 해서 구현해보면 되지 않을까?
일단 해봐.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int N;
cin >> N;
vector <int> v(N+1,0);
for(int i =1; i<= N; ++i) cin >> v[i];
vector<int>dp(N+1, 0);
dp[1] = v[1];
dp[2] = v[1]+v[2];
for(int i = 3; i<=N; ++i){
dp[i] = max(dp[i-2]+v[i], dp[i-3]+v[i-1]+v[i]);
//두칸 jump해서 온거 vs 연달아온거 비교해서 더 큰 값 저장
//연달아서 온거는 3칸 연달아오는거 방지 위해 3칸 아래 애랑 비교
}
cout << dp[N];
}
역시 바로 성공 ★
'C++ 문제풀기 > 백준-프로그래머스' 카테고리의 다른 글
| 프로그래머스 | 전력망을 둘로 나누기 (0) | 2025.11.12 |
|---|---|
| 프로그래머스 | 합승 택시 요금 (0) | 2025.11.05 |
| 백준 | 1931. 회의실 배정 (0) | 2025.10.31 |
| 백준 | 1920. 수 찾기 (0) | 2025.10.31 |
| 프로그래머스 | 귤 고르기 (0) | 2025.10.28 |