이번에 풀어본 문제는
백준 19951번 태상이의 훈련소 생활 입니다.
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int [] map;
static int [] prefix_arr;
public static void main(String[] args) throws IOException {
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());
map = new int[N+2];
st = new StringTokenizer(br.readLine());
for(int i = 1; i <= N; ++i) map[i] = Integer.parseInt(st.nextToken());
prefix_arr = new int[N+2];
for(int i = 0; i < M; ++i)
{
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
prefix_arr[start] += v;
prefix_arr[end+1] -= v;
}
for(int i = 1; i <= N; ++i)
{
prefix_arr[i] += prefix_arr[i-1];
map[i] += prefix_arr[i];
}
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for(int i = 1; i <= N; ++i) bw.write(map[i]+" ");
bw.flush();
bw.close();
}
}
입력된 M번의 명령을 수행한 후, 연병장에 쌓인 흙의 높이를 출력하는 문제입니다. 구간합을 활용해서 조교의 명령을 start부터 end 범위를 v만큼 쌓거나 파낸다고 했을 때, 배열의 start인덱스에는 +v, end+1 인덱스에는 -v를 해주고, 모든 명령의 결괏값이 누적된 prefix_arr를 앞에서부터 누적합하여 최종적으로 map과 더해주면 결과를 구할 수 있습니다.
기본적인 1차원 배열에서의 구간합 문제인것 같습니다.