[알고리즘] 11659번: 구간 합 구하기 4

11659번: 구간 합 구하기 4
첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j가 주어진다.
https://www.acmicpc.net/problem/11659
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            int N = Integer.parseInt(st.nextToken());
            int M = Integer.parseInt(st.nextToken());
            
            int[] arr = new int[N + 1];
            
            st = new StringTokenizer(br.readLine(), " ");
            
            for (int i = 1; i <= N; i++) {
                arr[i] = Integer.parseInt(st.nextToken());
                arr[i] += arr[i - 1];
            }
            
            for (int i = 0; i < M; i++) {
                st = new StringTokenizer(br.readLine(), " ");
                int start = Integer.parseInt(st.nextToken());
                int end = Integer.parseInt(st.nextToken());
                
                System.out.println(arr[end] - arr[start - 1]);
            }
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 각 원소 순차적으로 구간합을 기록하고
    • 만약 2 ~ 4 이라면
      • 1 ~ 4 까지의 구간합에서
      • 1까지의 구간합을 빼면
      • 2 3 4 의 모든 합이 도출된다.
    for (int i = 0; i < M; i++) {
        st = new StringTokenizer(br.readLine(), " ");
        int start = Integer.parseInt(st.nextToken());
        int end = Integer.parseInt(st.nextToken());
        
        System.out.println(arr[end] - arr[start - 1]);
    }
    • 그 과정이 이 과정이다.
  • 근데 프린트 스트림의 경우 사용할때마다 스트림을 열고 닫는 과정을 수행한다.
    • 반복 for 반복문이 만약 반복과정을 많이 수행하는 경우 상대적으로 수행시간이 오래 걸릴 수 밖에 없다.
  • 그래서 일단 출력할 모든 원소를 StringBuilder 에 담아놓고 출력하는 방법이 최적화 방법중 하나이다.

변경 코드

package org.example.알고리즘.구간합구하기4;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            int N = Integer.parseInt(st.nextToken());
            int M = Integer.parseInt(st.nextToken());
            
            int[] arr = new int[N + 1];
            
            st = new StringTokenizer(br.readLine(), " ");
            
            for (int i = 1; i <= N; i++) {
                arr[i] = Integer.parseInt(st.nextToken());
                arr[i] += arr[i - 1];
            }
            
            StringBuilder sb = new StringBuilder(M + 1);
            
            for (int i = 0; i < M; i++) {
                st = new StringTokenizer(br.readLine(), " ");
                int start = Integer.parseInt(st.nextToken());
                int end = Integer.parseInt(st.nextToken());
                
                sb.append(arr[end] - arr[start - 1]).append("\n");
            }
            
            System.out.println(sb);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Uploaded by N2T