본문 바로가기
CODING/BAEKJOON

[BAEKJOON] 2579번 계단 오르기

by snow_white 2022. 4. 24.

 


이 문제는 첫 번째 계단을 밟는 것을 시작으로 한 칸 혹은 두 칸씩 계단을 오를 수 있다.

단, 첫 번째 계단을 꼭 밟아야 하고, 연속으로 한 칸씩 세 번 반복할 수는 없다. 즉, 한 칸을 오른 다음 한 칸, 그 다음 두 칸 오르기만 가능하다. 

따라서 첫 번째 계단을 오르는 최대 점수는 첫 번째 계단의 가중치인 10점이고,

두 번째 계단을 오르는 최대 점수는 첫 번째 계단을 오른 후에 (첫 번째 계단 10 + 두 번째 계단 20으로 총 30점)이과 바로 두 번째 계단으로 오르는 20점 중 더 높은 점수인 30점 방식으로 계단을 오른다.

세 번째 계단을 오를 때는

1. 첫 번째 계단 세 번째 계단  ▶  10 + 20 + 15 = 25

2. 두 번째 계단  세 번째 계단  ▶  20 + 15 = 35

위 두 가지 중 최대값은 1. 경우에 해당하기 때문에 세 번째 계단까지 오르는 최대 점수가 45가 된다.

이처럼 이전 결과가 누적되어 영향을 미치는 것을 보아서 DP 유형 문제인 것을 알 수 있다!

어떤 값들이 현재 값에 영향을 미치는지 그림으로 살펴보자.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	static int N, arr[], sum[];

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		arr = new int[N + 1];
		sum = new int[N + 1];
		for (int i = 1; i <= N; i++) {
			arr[i] = Integer.parseInt(br.readLine());
		}
		sum[1] = arr[1];
		if (N >= 2) {
			sum[2] = arr[1] + arr[2];
			if(N>=3)
				sum[3] = Math.max(arr[1], arr[2]) + arr[3];
		}
		for (int i = 4; i <= N; i++) {
			sum[i] = Math.max(arr[i - 1] + sum[i - 3], sum[i - 2]) + arr[i];
		}
		System.out.println(sum[N]);
	}
}

[출처]

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

 

2579번: 계단 오르기

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

www.acmicpc.net

 

'CODING > BAEKJOON' 카테고리의 다른 글

[BAEKJOON] 연구소  (0) 2022.07.21
[BAEKJOON] 2468번 안전 영역  (0) 2022.05.26
[BAEKJOON] 2805번 나무 자르기  (0) 2022.04.02
[BAEKJOON] 1920번 수 찾기  (0) 2022.03.30
[BAEKJOON] 2775번 부녀회장이 될테야  (0) 2022.03.28

댓글