문제
매일 아침 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 |