[자료구조] 알고리즘

[백준] 1219번 연속합 (다이나믹 프로그래밍_JAVA)

콩지연 2023. 6. 23. 09:52

티스토리 시작하겠다고 마음먹은 후

미루고 미뤄왔던 알고리즘 정리!

 

사실 엄청난 코드는 아니지만

처음으로 DP문제를 검색 안하고 푼 기념으로 피드 박제

ヾ(≧▽≦*)

 

 


문제 

 

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

 

1912번: 연속합

첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

www.acmicpc.net

 

 

 


설계

 

알고리즘 [접근 방법] : DP

숫자가 10만까지 입력받을 수 있는데, 완전탐색으로 접근하면 시간초과 발생할 것이라 생각해 DP로 풀었다.

 

2차원 배열을 만들고, 첫 행은 각 입력값을 저장하고 두번째 행에는 누적합을 저장한다.

중요한 점은 누적합을 저장할 때, 그 전의 열의 두 값을 비교해 더 큰 값과 현재 값을 더한 누적합을 저장한다.

 

본문의 예제를 예를 든다면, 

배열[1][2](=9)의 값은, 그 전의 열의 값 -4와 6을 비교해 더 큰 값(=6)과 입력값(=3)을 더한 값이다.

배열[1][8](=33)의 값은, 그 전의 열의 값 12와 -2를 비교해 더 큰 값(=12)와 입력값(=21)을 더한 값이다. 

 

10   -4      3    1 5 6 -35   12     21   -1
10    6       9    10 15 21 -14 -2   33   32

 

이런 식으로 배열을 채워나간 후, 배열을 순회하면서 가장 높은 값을 찾으면 된다.

 

 

 


코드

import java.util.Arrays;
import java.util.Scanner;

public class Test_1912_연속합 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		//배열 크기 입력받기
		int n = sc.nextInt();
	
		//배열 생성 및 값 입력받기
		int[][] arr = new int[3][n];
		for(int i=0; i<n; i++) {
			arr[0][i]=sc.nextInt();	//현재값
		}
		
		//dp
		int max=0;
		for(int i=0; i<n; i++) {
			arr[1][i]=max+arr[0][i];	//누적합+현재값
			
			max=Math.max(arr[1][i], arr[0][i]);	//누적합, 현재값 비교하기
		}
		
		//최대값 찾기
		int result=Integer.MIN_VALUE;
		for(int i=0; i<n; i++) {
			int tmp=Math.max(arr[0][i], arr[1][i]);
			result=Math.max(tmp, result);
		}
		
		//출력
		System.out.println(result);
	
	}
}

 

 

(❁´◡`❁)

끝!