잡동사니/[2022] 회로이론

[백준/C] 11659번 구간 합 구하기 4 - 슬라이딩 윈도우 알고리즘

heylo 2022. 12. 11. 02:27

https://www.acmicpc.net/problem/11659

 

11659번: 구간 합 구하기 4

첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j

www.acmicpc.net

 

슬라이딩 윈도우 알고리즘을 사용한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define MAX_STRING_SIZE 100001


int main() {
    int n, m; // n: 숫자 개수, m: 구간 개수
    int a, b; // a, b: 구간 끝
    int i; // 반복
    int arr[MAX_STRING_SIZE];
    arr[0] = 0; // 이 코드 없어도 결과 정상적인 이유가 뭘까...

    scanf("%d %d", &n, &m);

    for (i = 1; i <= n; i++) {
        scanf("%d", &arr[i]);
        arr[i] += arr[i - 1];
    }

    for (i = 0; i < m; i++) {
        scanf("%d %d", &a, &b);
        printf("%d\n", arr[b] - arr[a - 1]);
    }

    return 0;
}

 

 

 

 

 

 

 

 

 


https://www.youtube.com/watch?v=uH9VJRIpIDY


아래는 시간초과 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define MAX_STRING_SIZE 100001



int main() {
    int n, m; // n은 입력할 숫자 개수/ m은 숫자 구간 개수
    int i, k; // 반복
    int a[MAX_STRING_SIZE];
    int left, right, sum = 0;

    scanf("%d%d", &n, &m);
    for (i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    
    for (i = 0; i < m; i++) {
        scanf("%d%d", &left, &right);
        for (k = left-1; k <= right-1; k++) {
            sum += a[k];
        }
        printf("%d\n", sum);
        sum = 0; // sum 초기화
    }
}

​