촉촉한초코칩

[백준] 11659(구간 합 구하기 4) c언어 (슬라이딩 윈도우 알고리즘) 본문

Algorithm

[백준] 11659(구간 합 구하기 4) c언어 (슬라이딩 윈도우 알고리즘)

햄친구베이컨 2023. 11. 2. 19:37

문제

수 N개가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오.

입력

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

출력

총 M개의 줄에 입력으로 주어진 i번째 수부터 j번째 수까지 합을 출력한다.

 


 

 

#include <stdio.h>
#include <stdlib.h>

int main() {
  int a, b;
  scanf("%d %d", &a, &b);

  int *num = calloc(a, sizeof(int));
  int *sum = calloc(b, sizeof(int));
  
  int c, d, tmp = 0;

  for(int i=0; i<a; i++) {
    scanf("%d", &num[i]);
  }

  for(int i=0; i<b; i++) {
    tmp = 0;
    scanf("%d %d", &c, &d);
    for(int j=c-1; j<d; j++) {
      tmp += num[j];
    }
    sum[i] = tmp;
  }

  for(int i=0; i<b; i++) 
    printf("%d\n", sum[i]);

  free(num);
  free(sum);
  
    return 0;
}

처음에는 하나하나 계산하는 방법을 생각했는데, 계속해서 시간초과가 떴다.

지금은 5개밖에 없지만 나중에 100개 넘는 데이터가 들어오면 그때마다 누적값을 계산해야 하니 그런 것 같다.

 

방법을 모르겠어서 검색했다.

 

https://rujang.tistory.com/entry/%EB%B0%B1%EC%A4%80-11659%EB%B2%88-%EA%B5%AC%EA%B0%84-%ED%95%A9-%EA%B5%AC%ED%95%98%EA%B8%B0-4-CC

 

> 배열 데이터를 입력받으면 앞의 누적값과 더해서 미리 구해놓는 것이다.

 

ex) 5 4 3 2 1 입력

배열 인덱스 [0] [1] [2] [3] [4] [5]
입력값 0 5 4 3 2 1
누적값 0 5 9 12 14 15

사이의 값을 구하기 위해서는 두번째인덱스 - (첫번째인덱스-1)를 해야 그 사이의 누적값이 나온다. 

 

#include <stdio.h>
#include <stdlib.h>

int arr[100000];

int main() {

  int n, m, a, b;

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

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

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

이걸 슬라이딩 윈도우 알고리즘이라고 부르는 듯 하다.

: 교집합의 정보를 공유하고, 차이가 나는 양쪽 끝 원소만 갱신하는 방법

 

https://ji-musclecode.tistory.com/37