본문 바로가기

Algorithm/백준

백준 2259 수열

문제

매일 아침 9시에 학교에서 측정한 온도가 어떤 정수의 수열로 주어졌을 때, 연속적인 며칠 동안의 온도의 합이 가장 큰 값을 알아보고자 한다.

예를 들어, 아래와 같이 10일 간의 온도가 주어졌을 때, 

3 -2 -4 -9 0 3 7 13 8 -3

모든 연속적인 이틀간의 온도의 합은 아래와 같다.

이때, 온도의 합이 가장 큰 값은 21이다. 

또 다른 예로 위와 같은 온도가 주어졌을 때, 모든 연속적인 5일 간의 온도의 합은 아래와 같으며, 

이때, 온도의 합이 가장 큰 값은 31이다.

매일 측정한 온도가 정수의 수열로 주어졌을 때, 연속적인 며칠 동안의 온도의 합이 가장 큰 값을 계산하는 프로그램을 작성하시오. 

입력

첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기 위한 연속적인 날짜의 수이다. K는 1과 N 사이의 정수이다. 둘째 줄에는 매일 측정한 온도를 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -100 이상 100 이하이다. 

출력

첫째 줄에는 입력되는 온도의 수열에서 연속적인 K일의 온도의 합이 최대가 되는 값을 출력한다.

 

package ch.baekjoon;


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

/*
백준 2559 수열
 */
public class Algorithm26 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int day = Integer.parseInt(st.nextToken());
        int n = Integer.parseInt(st.nextToken());
        int[] arr = new int[day];
        int[] sumArr = new int[day - n + 1];
        int result = 0;
        int idx = 0;
        st = new StringTokenizer(br.readLine());
        while(st.hasMoreTokens()){
            arr[idx] = Integer.parseInt(st.nextToken());
            idx ++;
        }

        for(int i = 0 ; i <= day-n; i++){

           sumArr[i] = arr[i];
            for(int j = 1;  j <= n - 1 ; j++){
                sumArr[i] += arr[i+j];
            }
            if(i == 0){
                result = sumArr[i];
            }else if(result < sumArr[i]){
                result = sumArr[i];
            }
        }

        System.out.println(result);




    }
}

예제) 

10 2
3 -2 -4 -9 0 3 7 13 8 -3

예제출력 - 21

 

풀이

우선 첫째줄에 값을 주는 10이 아랫줄 숫자의 개수가 된다.

두번째 값으로 주는것은 구간의 합을 정하는것이다.

첫번째 값을 first 두번째 값을 second 라고하였을때 first 길이의 숫자들에서 second의 구간합을 구하는것은 

first - second +1 이 된다.

* first = 10 , second = 2

하여 더하는 sumArr 배열의 크기를 지정해주었다.

그뒤 arr배열에 두번째줄의 값들을 int로 형변환 하여 집어 넣어준 뒤 

이중포문으로 second 구간의 합들을 차례차례 더하였다.

이 문제에도 시간제한이 걸려있어 최대값을 구할때의 시간을 아끼고자 for문이 끝날때마다 result값을 갱신 해주어서 문제를 해결하였다.

'Algorithm > 백준' 카테고리의 다른 글

백준 18258 큐2  (0) 2022.08.28
백준 1764 듣보잡  (0) 2022.08.25
백준 11659 한수  (0) 2022.08.24
백준 2839 설탕 배달  (0) 2022.08.23
백준 10816 숫자 카드 2  (0) 2022.08.21