본문 바로가기

백준

백준11659 - 구간 합 구하기4

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

 

11659번: 구간 합 구하기 4

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

www.acmicpc.net

다이나믹 프로그래밍을 이용하여 풀었다. 구간의 합을 구하기 위해서 숫자의 처음부터 각 숫자의 위치까지의 모든 숫자의 합을 구하여 저장한다. 그런 다음 끝 구간까지의 합에서 구간이 처음 시작하는 직전까지의 모든 숫자 합을 뺀다. 그것을 출력하면 답이다.

#include <iostream>
#define MAX 100001
using namespace std;

int N, M; //N개의 숫자, M개의 테스트 케이스
int a, b; //a부터 b까지
int mat[MAX]; //i번째 숫자
int sum[MAX] = { 0, }; //i번째 숫자까지의 합

int main() {
    cin >> N >> M;
    for(int i = 1; i <= N; i++) { //N개의 숫자를 입력 
        scanf("%d", &mat[i]);
        sum[i] = sum[i - 1] + mat[i]; //첫번째부터 현재 숫자까지의 합을 구함
    }
    
    for(int i = 0; i < M; i++) {
        scanf("%d %d", &a, &b);
        printf("%d\n", sum[b] - sum[a - 1]) //b까지의 합에서 a - 1까지의 합을 뺀다;
    }
}

'백준' 카테고리의 다른 글

백준9753 - 짝 곱  (0) 2020.04.21
백준14430 - 자원 캐기  (0) 2020.04.19
백준11559 - Puyo Puyo  (0) 2020.04.09
백준1325 - 효율적인 해킹  (0) 2020.04.08
백준1780 - 종이의 갯수  (0) 2020.04.07