algorithm

[DP] 2579 런타임에러

tonirr 2020. 4. 27. 07:58

  • 런타임 오류

런타임 오류가 계속 나서 보니 if문으로 조건을 정해주지 않아서 오류가 났다. 

if문으로 n >= 2의 조건으로 구별해 주지 않을 경우 dp[2] 에서 아웃오브바운드 에러가 난다.

당연한게 dp = new int[n+1]로 인덱스가 0, 1인 배열로 만들었는데 인덱스가 2인 곳에 값을 저장하겠다고 하니 이러한 에러가 날 수 밖에 없다.

 

  • 배열 초기화

이 문제에서 기억해야 할 것은 배열을 new int[]로 초기화 해주면 인덱스마다 값을 넣지 않아도 0으로 초기화 할 수 있다는 것이다. 이게 항상 헷갈려서 3개가 연속되지 않도록 하는 조건이 걸리면 null이 뜰까봐 i인덱스 전까지는 모두 손수 0으로 세팅해주었던 것 같다.

아래 코드에서도 dp[3]의 경우를 지정해줄게 아니라 for문에 합쳐서 해도 dp[0]이 0으로 초기화 되어있기 때문에 따로 지정해 줄 필요가 없다.

 

  • max값

지금생각해보면 당연한 것인데 인덱스 값이 증가갈수록 dp의 실질적인 값도 증가한다.

 

public class Main {
	static int dp[], arr[];
	static int max;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in); 
		int n = sc.nextInt();
	
		dp = new int[n+1];
		arr = new int[n+1];

		for(int i = 1; i <= n; i++) {
			arr[i] = sc.nextInt();
		}
		sc.close();

		dp[1] = arr[1];
		if (n >= 2) 
			dp[2] = dp[1] + arr[2];
	
		for(int i = 3; i <= n; i++) {
			dp[i] = Math.max(dp[i-3]+arr[i-1]+arr[i], dp[i-2]+arr[i]);
		}
		System.out.println(dp[n]);
	}
}