백준 19951 태상이의 훈련소 생활 (Java,자바)

jonghyukLee·2022년 2월 5일
0

이번에 풀어본 문제는
백준 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차원 배열에서의 구간합 문제인것 같습니다.

profile
머무르지 않기!

0개의 댓글