DOTY

2) 백준 2579 - 계단 오르기 본문

Algorithm/Dynamic Programming

2) 백준 2579 - 계단 오르기

증식세포 2020. 11. 10. 15:22
728x90
반응형

<문제>

www.acmicpc.net/problem/2579

 

2579번: 계단 오르기

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

www.acmicpc.net

그동안 거의 웹만 했음...ㅎㅎㅎ...... 앞으로 자주 올...(크흠..)려야지 ㅎㅎㅎㅎㅎ

 

<코드>

#include <bits/stdc++.h>

using namespace std;

int main(void) {
	int N;
	cin >> N;
	
	int stair[300] = {0, };
	
	for(int i = 0; i < N; i++) {
		cin >> stair[i];
	}
	
	int max_stair[300] = {0, };
	
	max_stair[0] = stair[0];
	max_stair[1] = max(stair[1], stair[0]+stair[1]);
	max_stair[2] = max(max_stair[0]+stair[2], stair[1]+stair[2]);
	
	for(int i = 3; i < N; i++) {
		max_stair[i] = max(max_stair[i-3]+stair[i-1]+stair[i], max_stair[i-2]+stair[i]);
	}
	
	cout << max_stair[N-1] << endl;
	
	return 0;
}

처음엔 어떻게 해야할지 고민이 많았다....

그런데 하나하나 적어보면서 생각하니 풀리기 시작했다.

 

배열에 하나하나 적어가면서 계단의 갯수에 따라서 최댓값을 저장해둬서 후에 다시 쓰는 방법으로 계산을 했다.

그런데 연속으로 3개의 계단은 밟을 수 없으므로 다음을 생각해주자.

 

i번째 계단 전에 밟은 계단이....??

1. i-2 번째 계단이라면

2. i-1 번째 계단인데 그 전에 i-3 번째 계단을 밟았다면

3. i-1 번째 계단인데 그 전에 i-2 번째 계단을 밟았다면

 

1.

최댓값을 저장해둔 배열에서 index가 i-2번에 있는 수는 i-2번째 계단을 밟았을 때 최댓값이 저장되어 있다.

이 수를 그냥 i 번째 계단을 더해주면 i번째 계단에서 가질 수 있는 최댓값 후보가 하나 생겼다.

2.

그 전에 i-3번째 계단을 밟았으므로 i-1번째 다음에 i번째 계단을 밟을 수 있다. 1번의 방법과 비슷하게 i-3번째 계단을 밟았을 때 최댓값에서 i-1번째와 i번째 계단을 밟으므로 이 둘의 값을 더해주면 또 다른 최댓값 후보가 또 하나 생겼다.

3.

i-1번째 계단 전에 i-2번째 계단을 밟으면 i 번째 계단은 밟을 수 없으므로 패스!

 

1번과 2번의 값을 비교해서 더욱 큰 값을 index = i 인곳에 넣어주면 된다.

이를 N번 반복해서 index가 N인 곳을 출력해주면 끝!

 

DP.... 너무 어려워...ㅠㅠㅠㅠㅠㅠ

728x90
반응형

'Algorithm > Dynamic Programming' 카테고리의 다른 글

6) 백준 1753 - 최단경로  (0) 2023.01.27
5) 백준 11052 - 카드 구매하기  (0) 2020.12.04
4) 백준 1912 - 연속합  (0) 2020.11.10
3) 백준 1932 - 정수 삼각형  (0) 2020.11.10
1) 백준 1003 - 피보나치 수열  (0) 2020.10.22
Comments