백준(JAVA) 풀이/다이나믹 프로그래밍

백준(JAVA) 1912번 연속합 풀이

개발윗미 2022. 4. 25. 13:43

Java으로 구현한 1912번 연속합 문제 풀이입니다.

 

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

 

1912번: 연속합

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

www.acmicpc.net


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		String[] str = br.readLine().split(" ");
		int[] data = new int[n];
		int[] dp = new int[n];
		
		for (int i=0; i<n; i++) {
			data[i] = Integer.parseInt(str[i]);
			dp[i] = data[i];
		}
		
		int result = dp[0];
		for (int i=1; i<n; i++) {
			dp[i] = Math.max(dp[i], dp[i-1] + data[i]);
			result = Math.max(result, dp[i]);
		}
		
		System.out.println(result);
	}
}

 

1. 입력받은 데이터를 이루는 data 배열을 통해 dp 배열을 추가로 정의한다.

 

2. 연속된 몇 개의 수를 선택해야하므로, 반복문을 통해 dp[i]와 dp[i-1]+data[i]를 비교하여 더 큰 값을 dp[i]에 갱신한다.

   여기서 dp[i-1]은 이전에 갱신되었기 때문에 단순히 dp[i-1] + data[i]를 연산하여 해결할 수 있다.

 

3. 최종적으로 dp 배열에서 가장 큰 값을 출력한다.

   result의 경우 음수가 들어갈 수 있으므로 0으로 초기화하지 않고 dp 배열의 첫번째(0번째) 값으로 초기화한다.