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

leeng·2024년 7월 1일
0

처음에는 '연속된 수의 합 중 가장 큰 값'을 찾는 문제니까 n 개가 연속된 합들을 구할 때 이전까지의 값을 활용(dp...)하고, 그렇게 구한 연속합 중 큰 값을 구하면 되겠다^^! 라고 생각했었다. 그러나 결과는 메모리 초과, 2차 시도는 시간 초과...
아래가 2차 시도 코드이다.

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.parseInt(br.readLine());
        StringTokenizer tokenizer = new StringTokenizer(br.readLine());
        br.close();
        int max = -1001;
        int[] values = new int[n + 1];
        int[] sums = new int[n + 1];
        for (int i = 0; i < n; i++) {
            values[i + 1] = Integer.parseInt(tokenizer.nextToken());
            sums[i + 1] = values[i + 1];
            max = Math.max(max, values[i + 1]);
        }

        for (int i = 2; i < n + 1; i++) {
            for (int j = 1; j + i -1 <= n; j++) {
                sums[j] =  sums[j] + values[i+j-1];
                max = Math.max(max, sums[j]);
            }
        }

        bw.write(String.valueOf(max));
        bw.flush();
        bw.close();
    }

막연히 dp는 이전 값들을 배열에 저장해서 사용하는 것! 이라는 것에 꽂혀서 이런 생각을 했던 것 같다. 결국 다른 사람들의 풀이를 보고 아하.. 이전까지의 연속합의 자신의 값을 더한 값현재 자신의 값 중 큰 값을 취하는 거구나ㅠㅠ 깨닫고 다시 코드를 짰다.
아래가 그 코드이고 결과는 성공!
휴... dp 어렵다,,,

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

// 1912 - 연속합
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.parseInt(br.readLine());
        StringTokenizer tokenizer = new StringTokenizer(br.readLine());
        br.close();

        int max = Integer.parseInt(tokenizer.nextToken());
        int sum = max;
        for (int i = 1; i < n; i++) {
            int input = Integer.parseInt(tokenizer.nextToken());
            sum = Math.max(input, sum + input);
            max = Math.max(sum, max);
        }

        bw.write(String.valueOf(max));
        bw.flush();
        bw.close();
    }

}
profile
기술블로그보다는 기록블로그

0개의 댓글