반응형
    
    
    
  나열된 수열의 개수 n개
몇번 범위 합을 구해 볼지의 개수 m개
범위 지정 시작 start, 끝 end를 이용하여 수열의 범위의 합을 구하는 알고리즘이다.
즉,
n = 6, m = 2이면
2 3 5 4 1 3 의 수열을 만들고 (n에 의해)
1 3 (start = 1, end = 3)
2 5 라는 두개의 범위를 만든다. (m에 의해) (start = 2, end = 5)
그러면 출력되는 합은
10
13 이 출력된다.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #include <stdio.h>  int i,j,n,m,start,end,sum = 0;  int a[100005]; int main() {   scanf("%d %d",&n,&m);  for(i = 0; i < n ; i ++) scanf("%d",&a[i]); // 길이만큼 숫자 입력   for(i = 0; i < m ; i ++) // 몇번째부터 몇번째까지 더할지    {   scanf("%d %d",&start,&end);   for(j = start-1 ; j <= end-1 ; j++)   {    sum = sum + a[j];      }   printf("%d\n",sum);   sum = 0;   }    return 0;  } | Crocus | 
위의 알고리즘과 아래의 알고리즘은 둘다 수열의 합을 구하는 알고리즘이다.
하지만 위의 알고리즘은 n,m,start,end의 값이 커질수록 계산해야되는 양이 n*m이 되어 최악의 경우의수를 가져올 수 있다.
2중 for문에 의한 커지는 경우의 수이다.
하지만 아래 코드는
2중 for문의 내용을 분해해서 단일 for문으로 만들었기에
n+m의 경우의 수를 가져온다.
많은 경우 위의 알고리즘 처럼 구상하지만, 값이 커질때는 아래의 알고리즘 (Prefix Sum)이 있다는 것을 알고 있으면 좋다.
(물론 위의 알고리즘은 적당한 값일 경우 이용하여도 무방하다.)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include <stdio.h> int main() {   int i,n,m,start,end, ans;  int a[100000]; // 값을 받는 배열   int sum[100000]; // a[0]~a[n]까지 합을 넣어두는 배열   scanf("%d %d",&n,&m);  for(i = 0; i < n ; i++)   {      scanf("%d",&a[i]); // 길이만큼 숫자 입력       if (i == 0)          sum[i] = a[i];       else          sum[i] = sum[i-1] + a[i]; // a[0]부터 a[i-1]의 합을 넣어둔다.   }  for(i = 0; i < m ; i++) // 몇번째부터 몇번째까지 더할지    {   scanf("%d %d",&start,&end);   if (start == 1)       ans = sum[end-1];    else       ans = sum[end-1] - sum[start-2];  // 예를들면 S4 - S3은 a4 같은 알고리즘을 이용한다.    printf("%d\n",ans);  }   return 0;  } | Crocus | 
반응형
    
    
    
  'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
| 오름차순으로 수 정렬하기 (1) | 2015.12.15 | 
|---|---|
| 파도반 수열 (1) | 2015.12.12 | 
| 특수 알고리즘 해결문서 (0) | 2015.12.06 | 
| 1~n까지의 합 (2) | 2015.12.01 | 
| 더하기 사이클 (0) | 2015.12.01 |