본문 바로가기
백준(Java)/23년 5월

[Java] 백준 - 1912번: 연속합

by C0MPAS 2023. 5. 15.

5월 15일(월) - 동적 계획법 1 (1912번)

 

1912번: 연속합

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

www.acmicpc.net

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

문제점

1. BufferedReader 다음에 StringTokenizer 부분을 바로 이어서 작성했을 때 NumberFormatException 이 발생

-> StringTokenizer 부분을 아래의 풀이 - 1처럼 for문 바로 위에 위치시켰더니 정상 작동

-> 이유 더 알아봐야함

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

풀이 - 1

( C언어 풀이 그대로 활용 )

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{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //StringTokenizer st = new StringTokenizer(br.readLine()," ");

        int n = Integer.parseInt(br.readLine());
        int[] num = new int[n+1];
        int[] tmp_sum = new int[n+1];

        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        for(int i=1; i<n+1; i++)
        {
            num[i] = Integer.parseInt(st.nextToken());
        }

        tmp_sum[1] = num[1];
        for(int i=2; i<n+1; i++)
        {
            if((tmp_sum[i-1] + num[i]) < num[i])
            {
                tmp_sum[i] = num[i];
            }
            else
            {
                tmp_sum[i] = tmp_sum[i-1] + num[i];
            }
        }

        int max = -1000000;
        for(int i=1; i<n+1; i++)
        {
            if(max < tmp_sum[i])
            {
                max = tmp_sum[i];
            }
        }

        System.out.println(max);
    }
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

풀이 - 2

( Math.max 활용하여 간단하게 정리한 풀이)

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{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        int[] num = new int[n+1];
        int[] tmp_sum = new int[n+1];

        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        for(int i=1; i<n+1; i++)
        {
            num[i] = Integer.parseInt(st.nextToken());
        }

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

        int max = -1000000;
        for(int i=1; i<n+1; i++)
        {
            max = Math.max(tmp_sum[i], max);
        }

        System.out.println(max);
    }
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

댓글