Algorithm

[BAEKJOON] 1912번 : 연속합 (JAVA)

멍목 2022. 1. 29. 01:38
반응형

- 알고리즘 분류 : 다이나믹 프로그래밍, Bottom-Up 방식

- 사용 언어 : JAVA

- 문제 요점

  1. 연속된 한 그룹의 합 중 최대 합을 출력
  2. 음수를 포함하더라도 그 이전 혹은 이후의 값이 더 커서 이득일 수 있음

- 점화식 도출 

d[i] = Math.max(d[i - 1] + arr[i], arr[i]);

(이전의 연속된 수 + 현재 수 or 현재 수) 중 높은 것을 현재 숫자의 최댓값으로 설정

 

소스 설명은 주석을 참고해주세요.

 

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

public class Main {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int N = Integer.parseInt(br.readLine());
		int[] arr = new int[N];
		int[] d = new int[N];
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		for(int i=0;i<N;i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		
		// 첫 번째 수는 첫 번째가 가장 큰 값이다.
		d[0] = arr[0];
		
		// 최댓값 변수 
		int max = arr[0];
		
		// (이전의 연속된 수 + 현재 수 or 현재 수) 중 높은 것을 현재 숫자의 최댓값으로 설정한다.
		for (int i = 1; i < N; i++) {
			d[i] = Math.max(d[i - 1] + arr[i], arr[i]);
			max = Math.max(max, d[i]);
		}
		
		// 최댓값 출력 
		System.out.println(max);
		
	}

}
반응형