멍두의 개발새발
[백준] 계단오르기 in Java 본문
반응형
📍 문제
DP 문제이다.
BFS로도 풀 수 있지만 bfs로 풀면 메모리초과로 실패가 뜬다..ㅠㅠ
📍 코드 설명
- n번째 계단을 오르는 방법은 두가지이다
- n-1번째 -> n번째로 오르기 (연속 2계단)
- n-2번째 -> n번째로 오르기 (연속 1계단)
- dp[stairsNum + 1][2] 를 두어서 dp[n][1] -> n-2, n으로 올라온 값 / dp[n][2] -> n-1, n으로 올라온 값을 두어 최대 값을 구한다.
- dp[n][1] = Math.max(dp[n-2][1], dp[n-2][2]) + stairs[n]
- 두칸 전에는 한칸 연속으로 와도되고, 두칸 연속으로 와도 되기 때문에 어떤 값이 최대인지 판단한다
- dp[n][2] = dp[n-1][1] + staris[n]
- 두칸 연속에서는 반드시 1칸 연속으로 온 애만 올 수 있기 때문에 최대를 판별할 필요가 없다
📍 코드
✔️ 코드
더보기
import java.io.*;
import java.util.*;
public class Main {
static int[] stairs;
static int[][] dp;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int stairsNum = Integer.parseInt(br.readLine());
stairs = new int[stairsNum+1];
dp = new int[stairsNum+1][3]; //1 : i포함 연속 1칸 2 : i포함 연속 2칸
for(int i = 1; i <= stairsNum; i++) {
stairs[i] = Integer.parseInt(br.readLine());
}
//stairs가 0, 1, 2일때 index 에러 주의
if(stairsNum >= 1) {
dp[1][1] = stairs[1];
dp[1][2] = stairs[1];
}
if(stairsNum >= 2) {
dp[2][1] = stairs[2];
dp[2][2] = stairs[1] + stairs[2];
}
for(int i = 3; i <= stairsNum; i++) {
//i-2 -> i 밟아서 올라온 경우 (i-2에서 최대 점수로 올라와야함)
dp[i][1] = Math.max(dp[i-2][1], dp[i-2][2]) + stairs[i];
//i-1 -> i 밟아서 연속 2계단 밟아서 올라온 경우
dp[i][2] = dp[i-1][1] + stairs[i];
}
//어떤 값이 최대인지 판단
int answer = Math.max(dp[stairsNum][1], dp[stairsNum][2]);
System.out.println(answer);
}
}
📍 틀린이유
솔직히 bfs로 풀어도 맞게해줘야하는거아닝감?
📍 기억할 것
n-2, n-1 -> n을 구할 수 있는 경우 dp로 푸는게 가장 빠른 방법이다!!
반응형
'Algorithm > BOJ' 카테고리의 다른 글
[백준] 1로 만들기 in Java (0) | 2025.01.31 |
---|---|
[백준] solved.ac (in Java) (0) | 2024.10.18 |
[백준] IOIOI in Java (0) | 2024.10.16 |
[백준] 나이순 정렬 in Java (0) | 2024.07.30 |
[백준] 1,2,3 더하기 in Java (3) | 2024.07.14 |