Java/Algorithm

[Java-Algorithm] HackerRank Java - Array Manipulation -누적합풀이

Jeong Jeon
반응형

1).문제 : www.hackerrank.com/challenges/crush

 

Array Manipulation | HackerRank

Perform m operations on an array and print the maximum of the values.

www.hackerrank.com

주어진 배열에 시작점과 끝점을 제시하고, 시작점~끝점에 더해질 k 값이 주어진다.

시작점~끝점에 각각 K를 더하고 난뒤 최종 배열에서 가장 큰 값을 추출해내는 문제.

 

 

2). 풀이 : 

2중 for문을 사용해 아주 쉽게 해결 할 수 있다고 생각했다.

하지만 Timeout! 어떻게 풀어야할지 한참 ...아주 한참 머리를 괴롭혔다...

 

어떻게 하면 for문을 한번만 돌수 있을까......!!!!!!!!!!!!!!!!!!!!

누적합을 사용해서 for문 한번으로 각 항의 값을 알수있었따...

변화값만 사용해서 구하는게 키포인트

 

누적합의 개념을 처음 알게되었다...

import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;

public class Solution {

    // Complete the arrayManipulation function below.
    static long arrayManipulation(int n, int[][] queries) {
        //0부터시작해서 각 항에 더해진 최대값을 구하는 문제.
        //누적합을 구하기위해 길이 +1해준다.
        int[] arr = new int[n+1];
        
        for(int i=0; i<queries.length; i++){
            int a = queries[i][0];
            int b = queries[i][1];
            int k = queries[i][2];
            
            //만들어낸 배열에 a,b,k를 적용시켜보자.
            //시작점에는 +
            arr[a]+=k;
            //만약 b+1이 길이보다 짧거나 같을때만
            if((b+1)<=n){
                //끝지점+1 에 -
                arr[b+1]-=k;
            }
        }
        
        long result = 0;
        long temp = 0;
        for(int i=1; i<arr.length; i++){
            temp+=arr[i];
            if(result<temp){
                result = temp;
            }
        }
        return result;
    }

    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) throws IOException {
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));

        String[] nm = scanner.nextLine().split(" ");

        int n = Integer.parseInt(nm[0]);

        int m = Integer.parseInt(nm[1]);

        int[][] queries = new int[m][3];

        for (int i = 0; i < m; i++) {
            String[] queriesRowItems = scanner.nextLine().split(" ");
            scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");

            for (int j = 0; j < 3; j++) {
                int queriesItem = Integer.parseInt(queriesRowItems[j]);
                queries[i][j] = queriesItem;
            }
        }

        long result = arrayManipulation(n, queries);

        bufferedWriter.write(String.valueOf(result));
        bufferedWriter.newLine();

        bufferedWriter.close();

        scanner.close();
    }
}
반응형