잡동사니/[2022] 회로이론
[백준/C] 2559번 수열 (슬라이딩 윈도우, 누적합)
heylo
2022. 12. 11. 02:18
https://www.acmicpc.net/problem/2559
2559번: 수열
첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기
www.acmicpc.net
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <limits.h>
#define MAX_ARRY_SIZE 100001
#define MAX(x,y) ( ((x) > (y)) ? (x):(y) )
int main(void) {
int a, b; // a: 온도 개수, b: 연속적인 b일
int i, k; // 반복
int t; // 온도
int sum[MAX_ARRY_SIZE] = { 0, }, max = INT_MIN;
scanf("%d%d", &a, &b);
// 누적합: 슬라이딩 윈도우
for (i = 1; i <= a; i++) {
scanf("%d", &t);
sum[i] = sum[i - 1] + t;
}
for (i = b; i <= a; i++) {
max = MAX(max, sum[i] - sum[i - b]);
}
printf("%d", max);
return 0;
}
예) a = 7 , b = 3

a
|
b
|
c
|
d
|
e
|
f
|
g
|
sum[0]
|
0
|
sum[1]
|
a
|
sum[2]
|
a + b
|
sum[3]
|
a + b + c
|
sum[4]
|
a + b + c + d
|
sum[5]
|
a + b + c + d + e
|
sum[6]
|
a + b + c + d + e + f
|
sum[7]
|
a + b + c + d + e + f + g
|

i
|
sum[i] - sum[i-b]
|
sum[i] - sum[i-b]
|
3
|
sum[3] - sum[0]
|
a + b + c
|
4
|
sum[4] - sum[1]
|
b + c + d
|
5
|
sum[5] - sum[2]
|
c + d + e
|
6
|
sum[6] - sum[3]
|
d + e + f
|
7
|
sum[7] - sum[4]
|
e + f + g
|
다른 방법

아래는 시간 초과된 코드
억지로 생각 쥐어짜서 코드 짰음 크크카카커캬커ㅑ커
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <limits.h>
#define MAX 100001
int main(void) {
int a, b, max = INT_MIN; // a: 온도 개수, b: 연속적인 b일
int i, k; // 반복
int t[MAX]; // 온도 저장 배열
int sum[MAX] = { 0, };
scanf("%d%d", &a, &b);
for (i = 0; i < a; i++) {
scanf("%d", &t[i]);
}
// 누적합 배열 만들기
for (i = 0; i <= a - b; i++) {
for (k = 0; k < b; k++) {
sum[i] += t[i + k];
}
}
for (i = 0; i <= a - b; i++)
if (sum[i] > max) max = sum[i];
printf("%d", max);
return 0;
}