처음부터 차근차근

구간 합 구하기 본문

알고리즘

구간 합 구하기

_soyoung 2022. 10. 7. 00:06
반응형

문제 (시간제한 : 1초)

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

 

11659번: 구간 합 구하기 4

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

www.acmicpc.net

문제부터 이해가 잘 안됀다 ㅠㅠ

예제 입력 1로 문제를 설명해보면

5  3      <--- 5 : 데이터 개수, 3 : 구할 문제 개수
5  4  3  2  1    <--- 데이터 5개
1  3    <--- 문제 : 1번째 ~ 3번째 수의 합을 구하세요(5 + 4 + 3)
2  4    <--- 문제
5  5    <--- 문제

이렇다

 

 

내 풀이

public class Main
{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
	    
	    StringTokenizer st = new StringTokenizer(br.readLine());
	    int num = Integer.parseInt(st.nextToken());
        int quizNum = Integer.parseInt(st.nextToken());
        
        st = new StringTokenizer(br.readLine());
        int[] arr = new int[num];
        
        for (int i = 0; i < num; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        
        int sum;
        for (int i = 0; i < quizNum; i++) {
            sum = 0;
            st = new StringTokenizer(br.readLine());
            int num1 = Integer.parseInt(st.nextToken()) - 1;
            int num2 = Integer.parseInt(st.nextToken()) - 1;
            for (int j = num1; j <= num2; j++) {
                sum += arr[j];
            }
            
            bw.write(String.valueOf(sum) + "\n");
        }
	    bw.flush();
	    bw.close();
	    br.close();
	}
}

처음에 이렇게 짰는데 시간 초과가 났다.

첫번째 줄에 들어갈 수 있는 수의 최대가 100000이니까 위에서 내가 짰던 방식대로 하면 최악의 경우 1 ~ 100000까지 더해야 한다.

그래서 시간초과가 난 것 같다.

 

이런 문제에서는 합 배열 공식구간 합 공식을 사용해야한다.

<합 배열 공식>

S[i] = S[i - 1] + A[i]
* S는 1 ~  i번째 원소까지의 배열의 합을 뜻하고, A[i]는 i번째 원소값을 뜻한다. 

 

<구간 합 공식>

S[a] - S[i - 1]
* i에서 a까지의 합

이건 이미지로 생각하면 더 편하다.

세번째 ~ 마지막째 합을 구하려면

전체 - (5 + 4)를 해주면 된다.

 

이 방식으로 예제 문제1을 풀어보면

2 4 : S[4] - S[1] = 14 - 5 = 9

이렇게 된다.

 

수정한 코드

import java.io.*;
import java.util.StringTokenizer;

public class Main
{
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
	    
	    StringTokenizer st = new StringTokenizer(br.readLine());
	    int num = Integer.parseInt(st.nextToken());
        int quizNum = Integer.parseInt(st.nextToken());
        
        st = new StringTokenizer(br.readLine());
        int[] sum = new int[num + 1];
        sum[0] = 0;
        for (int i = 1; i <= num; i++) {
            sum[i] = sum[i - 1] + Integer.parseInt(st.nextToken());
        }
        
        for (int i = 0; i < quizNum; i++) {
            st = new StringTokenizer(br.readLine());
            int num1 = Integer.parseInt(st.nextToken());
            int num2 = Integer.parseInt(st.nextToken());
            
            bw.write(String.valueOf(sum[num2] - sum[num1 - 1]) + "\n");
        }
	    bw.flush();
	    bw.close();
	    br.close();
	}
}

 

반응형

'알고리즘' 카테고리의 다른 글

DFS, BFS 알고리즘  (0) 2022.10.10
좋은 수 구하기  (2) 2022.10.09
평균 구하기  (0) 2022.09.27
평균 넘는 사람 비율 구하기  (0) 2022.09.24
최댓값, 최솟값 구하기  (0) 2022.09.22
Comments