View
https://www.acmicpc.net/problem/2579
📚 문제
계단 오르는 데는 다음과 같은 규칙이 있다.
1. 계단은 한 번에 한 계단씩 또는 두 계단씩 오를 수 있다. 즉, 한 계단을 밟으면서 이어서 다음 계단이나, 다음 다음 계단으로 오를 수 있다.
2. 연속된 세 개의 계단을 모두 밟아서는 안 된다. 단, 시작점은 계단에 포함되지 않는다.
3. 마지막 도착 계단은 반드시 밟아야 한다.
따라서 첫 번째 계단을 밟고 이어 두 번째 계단이나, 세 번째 계단으로 오를 수 있다. 하지만, 첫 번째 계단을 밟고 이어 네 번째 계단으로 올라가거나, 첫 번째, 두 번째, 세 번째 계단을 연속해서 모두 밟을 수는 없다.
각 계단에 쓰여 있는 점수가 주어질 때 이 게임에서 얻을 수 있는 총 점수의 최댓값을 구하는 프로그램을 작성하시오. 따라서 첫 번째 계단을 밟고 이어 두 번째 계단이나, 세 번째 계단으로 오를 수 있다. 하지만, 첫 번째 계단을 밟고 이어 네 번째 계단으로 올라가거나, 첫 번째, 두 번째, 세 번째 계단을 연속해서 모두 밟을 수는 없다.
각 계단에 쓰여 있는 점수가 주어질 때 이 게임에서 얻을 수 있는 총 점수의 최댓값을 구하는 프로그램을 작성하시오.
📝 문제 해설
n번째의 계단을 밟는 경우의 수
- (n-3)번째 계단을 밟고 (n-1)번째 계단을 밟는 경우
- (n-2)번째 계단을 밟는 경우
규칙 2에 의해서 연속해서 3개의 계단을 밟는 것은 불가능하기 때문에 두가지 경우만 고려하면 된다.
테이블 정의
score[i] : 해당 계단의 위치까지의 최고 점수값 배열
점화식 세우기
마지막 칸의 계단은 무조건 밟아야 하므로 위의 경우 2가지 중 큰 값 + 현재 계단의 값을 더한 값이 해당 칸의 score가 된다.
따라서, score[n] = Math.max(score[n-3] + stair[n-1], score[n-2]) + stair[n]
초기값 정의
1번과 2번, 3번 계단의 경우는 n-3이 존재하지 않기 때문에 값을 직접 정의해줘야함
score[1] = stair[1];
score[2] = stair[1] + stair[2];
score[3] = Math.max(stair[1], stair[2]) + stair[3];
💻 코드
import java.util.Scanner;
public class BOJ2579 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[] stair = new int[301];
int[] score = new int[301];
for (int i = 1; i <= N; i++)
stair[i] = sc.nextInt();
score[1] = stair[1];
score[2] = stair[1] + stair[2];
score[3] = Math.max(stair[1], stair[2]) + stair[3];
for (int n = 4; n <= N; n++) {
score[n] = Math.max(score[n - 3] + stair[n - 1], score[n - 2]) + stair[n];
}
System.out.println(score[N]);
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[동적 계획법] 백준 10844번 쉬운 계단 수(Java) (0) | 2022.12.22 |
---|---|
[정렬] 백준 10989번 수 정렬하기3(Java) (0) | 2022.12.21 |
[DFS/BFS] 백준 13549번 숨바꼭질 3(Java) (0) | 2022.12.15 |