728x90
https://www.acmicpc.net/problem/2579
2579번: 계단 오르기
계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점
www.acmicpc.net
풀이)
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main_BJ_2579_계단오르기 {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] stairs = new int[n+1];
for(int i=1; i<=n; i++)
stairs[i] = Integer.parseInt(br.readLine());
/*
연속된 세 개의 계단을 밟을 수는 없음
따라서 "밟는" 계단(n)을 기준으로 두 개의 값 중 최댓값을 구해야함.
n번째 계단에서의 최대값은 1, 2 중에서 최대값이다.
1. n-3번째 계단의 최대값 + n-1 계단값 + n 계단값
2. n-2번째 계단의 최대값 + n 계단값
문제 예시)
마지막 계단(6)에서의 최대값
1. 3번째 계단에서의 최대값 + 5번째 + 6번째 계단 밟을 때
2. 4번째 계단에서의 최대값 + 6번째 계단 밟을 때
1, 2 중 최대값을 고르면 된다
*/
int[] dp = new int[n+1];
//dp[0] = 0;
dp[1] = stairs[1]; // 첫 번째 계단은 첫 번째 밟았을 때가 최대
if(n>1)
dp[2] = stairs[1] + stairs[2]; // 두 번째 계단은 1+2 계단 밟았을 때가 최대
for(int i=3; i<=n; i++)
dp[i] = Math.max(dp[i-3] + stairs[i-1] +stairs[i], dp[i-2] + stairs[i]);
System.out.println(dp[n]);
}//main
}
전형적인 dp 문제인데,,, 솔직히 오랜만에 풀어서,,,, 몰랐다고 하기엔 변명같고ㅋㅋㅋ
dp문제가 어렵다... 쥬륵... 실번데...
규칙성을 찾으려고 노력했고, 점화식을 이끌어내려했는데 그게 잘 안 되었다.
다시 한 번 풀어보면서 화이팅 해봐야겠다.
또, n=1, n=2일때의 범위도 잘 생각해서 작성하자!
안 그럼 array index out of bounds 에러가 나온다.
728x90
'코테 > 백준' 카테고리의 다른 글
백준 11725 트리의 부모찾기(JAVA) (0) | 2023.01.29 |
---|---|
백준 1271 엄청난 부자2(JAVA) (0) | 2023.01.28 |
백준 17219 비밀번호 찾기(JAVA) (0) | 2023.01.26 |
백준 1676 팩토리얼 0의 개수(JAVA) (0) | 2023.01.25 |
백준 9663 N-Queen(JAVA) (0) | 2023.01.24 |