티스토리 뷰

algo/백준

[백준] 1912_연속합 (JAVA)

이숨니 2022. 9. 19. 20:47

1. 문제

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

 

1912번: 연속합

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

www.acmicpc.net


 

 

2. 문제 풀이 겸 회고

나 진짜 DP... 못하는데......

하지만 포기하지 않는다... DP.. 단계별로 풀어보고 있지만.. 이번 dp는  처음으로 타 블로그 참고하지 않고

혼자 힘으로 해결해 나갔다는 그러한 이야기... 진짜 뿌듯.... (대견해 이숨)

나는 DP 풀 때 점화식보다는 규칙을 찾는 것 같다.. 이거 맞는지 모르겠는데... ㅠㅠㅠㅠ

 

규칙을 찾았다!!!...

연속되면서 가장 큰 수를 찾는 건데.. 

연속된 누적합 구하고 음수가 나오면 다시 처음부터 계산해주기

 

예시를 들어보면

2    3   -1   3    7    3    9  14   9  10   -> DP 배열로 따로 관리..

이렇게 dp 배열에 값을 저장하면서 계산해주면 된다.

dp[i] = dp[i-1] + num[i]   해줘서 dp값을 차곡차곡 쌓아준다.

하지만

dp[i-1] <  0 

dp는 연속된 합의 값이니깐  음수일 경우는 굳이 필요 없고 값만 더 낮추는 것이기 때문에 리셋 (num값 다시 데려오기)

dp[i] = num[i]   현재부터 다시 시작 

이런 식으로 값 구해줘서 

dp 배열에서 가장 큰 값 찾아주면 끗~~~~~~~~~~

 

 

 

3. 코드

package net.acmicpc.solution;

import java.util.*;
import java.io.*;


public class Solution_1912_연속합 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		int[] num = new int[N];

		StringTokenizer st = new StringTokenizer(br.readLine());
		for (int i = 0; i < num.length; i++) {
			num[i] = Integer.parseInt(st.nextToken());
		}

		int[] dp = new int[N];
		dp[0] = num[0];


		for (int i = 1; i < num.length; i++) {
			if (dp[i - 1] < 0) {
				dp[i] = num[i];
			} else {
				dp[i] = dp[i - 1] + num[i];
			}
		}

		//System.out.println(Arrays.toString(dp));
		int max = num[0];
		for (int i = 1; i < dp.length; i++) {
			max = Math.max(dp[i], max);

		}
		System.out.println(max);

	}
}

 

 

 

피드백은 언제나 환영입니다 :) 🌳

댓글