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


- 한 계단, 두 계단 씩만 이동 가능
- 연속한 3개의 계단 불가
- 마지막 계단 반드시 밟음
- 얻을 수 있는 총 점수의 최댓값 구하기
2. 🤔 풀이 생각
이 문제의 핵심은 2계단을 가면 무조건 이동해야 한다는 것이다. 3 계단을 가지 전에 끊어줘야 하므로, 현재 계단에서 선택할 수 있는 경우의 수는 2가지뿐이다.
1. 직전의 계단(n-1)을 밟고 현재 계단을(n)을 밟는다.
2.두 번째 전 계단(n-2)을 밟고 현재 계단(n)을 밟는다.
여기서 1번은 세 계단을 이어서 밟을 수 없다는 조건을 고려해야 한다. 그러므로 n-3 계단을 밟고 n-1 계단을 밟는경우로 계산해줘야 한다.
두 가지 경우의 수중 더 높은 포인트를 얻는 계단을 선택한다. 2번에서는 이미 간격차이가 일어나므로 이어서 밟을 수 없다는 조건을 확인할 필요 없다. 두 경우 중 더 높은 것을 택한다.
for(int i=3; i<= N; i++){
dp[i] = Math.max(dp[i-3] + nums[i-1],dp[i-2]) + nums[i];
}
3. 📄 전체 코드
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int nums [] = new int[301];
int [] dp = new int[301];
for(int i =1; i<=N; i++){
nums[i] = Integer.parseInt(br.readLine());
}
dp[1] = nums[1];
dp[2] = nums[1] + nums[2];
for(int i=3; i<= N; i++){
dp[i] = Math.max(dp[i-3] + nums[i-1],dp[i-2]) + nums[i];
}
bw.write(dp[N]+"\n");
bw.flush();
bw.close();
br.close();
}
}
'알고리즘 > 백준' 카테고리의 다른 글
| [백준] 배열 돌리기1 : 16926 : Java - 구현 (S1) (3) | 2023.11.23 |
|---|---|
| [백준] 가장 가까운 세 사람의 심리적 거리 : 20529 : Java - 완전 탐색(S1) (1) | 2023.11.22 |
| [백준] 케빈 베이컨의 6단계 법칙 : 1389 : Java - BFS (S1) (3) | 2023.11.21 |
| [백준] 리모컨 : 1107 - 완전 탐색 (G5) (1) | 2023.11.20 |
| [D3] 18662 등차수열 만들기 (0) | 2023.11.18 |