https://www.acmicpc.net/problem/11659
문제
풀이
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer sc = new StringTokenizer(br.readLine());
int N = Integer.parseInt(sc.nextToken());
int M = Integer.parseInt(sc.nextToken());
int[] input = new int[N+1];
int[] sum = new int[N+1];
sc = new StringTokenizer(br.readLine());
for(int i = 1; i < N+1; i++){
input[i] = Integer.parseInt(sc.nextToken());
sum[i] = sum[i-1] + input[i];
}
for(int i = 0; i < M; i++){
sc = new StringTokenizer(br.readLine());
System.out.println(-sum[Integer.parseInt(sc.nextToken()) - 1] + sum[Integer.parseInt(sc.nextToken())]);
}
}
}
문제를 해결하기 위해서는 구간 합 풀이법을 알아야 한다.
구간 합이란 배열을 받음과 동시에 구간까지의 합을 미리 구해 하나의 배열을 추가적으로 만들어두는 것이다.
예를 들면, 크기가 5인 배열을 입력 받음과 동시에 0, 0+1, 0+1+2, 0+1+2+3 이런 식으로 만드는 것이다. 여기서 0+1+2+3 을 구할 때 네번 더하는 것이 아닌 이 전의 배열 값을 이용해 계산을 최적화 한다.
이렇게 계산하는 이유는 문제의 조건을 보면 100,000의 크기를 갖는 배열을 만들어야 하기 때문에 최악의 경우 10억번의 계산이 필요할 수도 있다. 이 과정을 생략하기 위해 하는 것이다.
버퍼리더와 스트링토크나이저는 아직 경험이 부족해 더 많이 사용해보고 코드르 깔끔하게 짜는 연습을 해야할 것 같다.
'문제 풀이 > 백준' 카테고리의 다른 글
[백준] 1940번. 주몽 (JAVA) (2) | 2024.01.28 |
---|---|
[백준] 2018번. 수 들의 합5 (0) | 2024.01.28 |
[백준] 1546번. 평균 (JAVA) (0) | 2024.01.28 |
[백준] 11720번. 숫자의 합(JAVA) (1) | 2024.01.28 |
[백준] 13164번. 행복 유치원(JAVA) (0) | 2024.01.17 |