코딩 문제 풀이/Hacker Rank

[문제풀이] Hacker Rank - The Maximum Subarray

PowerCoding 2020. 11. 11. 00:37

HackerRank link

The Maximum Subarray

풀이 핵심

두가지를 풀어야 됨.
[max subsequence]

  1. 단순히 양수를 더하면 최댓값을 알 수 있음.

[max subArray]

  1. 동적 프로그래밍으로 풀이
  2. 아래의 표와 같이 최대 subArray의 sum은 sum의 최대값 - sum의 최소값(단, 최대값 이전 index) 이다.
index 0 1 2 3 4 5 6
arr -2 2 -1 2 3 4 -5
sum -2 0 -1 1 4 8 -3

답은 10

Algorithm

  1. 현재까지의 sum 값을 구한다.
  2. 최소 값과 최대값을 업데이트 하며, subArrMax를 업데이트한다.
  3. 양수를 더하며 subsequence의 최대값을 구한다.
  4. 과정 1~4를 반복한다.

Source Code

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 maxSubarray function below.
    static long[] maxSubarray(long[] arr) {
        long[] sum = new long[arr.length];

        long subArrMax = arr[0];
        long sumMin = arr[0];
        long subSeqMax = Long.MIN_VALUE;

        for(int i = 0 ; i < arr.length ; i++)
        {
            if(i == 0)
            {
                sum[i] = arr[0];
            }
            else
            {
                sum[i] += sum[i-1] + arr[i];
                if(sum[i-1] < sumMin) sumMin = sum[i-1];

                long subMax = sum[i] - sumMin;
                subMax = sum[i] < subMax ? subMax : sum[i];

                if(subArrMax < subMax) subArrMax = subMax;
            }

            if(arr[i] > 0)
            {
                if(subSeqMax > 0)
                {
                    subSeqMax += arr[i];
                }
                else
                {
                    subSeqMax = arr[i];
                }
            }
            else
            {
                if(subSeqMax < 0 )
                {
                    if(subSeqMax < arr[i])
                    {
                        subSeqMax = arr[i];
                    }
                }                    
            }
        }

        long[] result = new long[2];
        result[0] = subArrMax;    // 2, -1, 2, 3, 4
        result[1] = subSeqMax;    // 2,  2, 3, 4
        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")));

        int t = scanner.nextInt();
        scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");

        for (int tItr = 0; tItr < t; tItr++) {
            int n = scanner.nextInt();
            scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");

            long[] arr = new long[n];

            String[] arrItems = scanner.nextLine().split(" ");
            scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");

            for (int i = 0; i < n; i++) {
                long arrItem = Long.parseLong(arrItems[i]);
                arr[i] = arrItem;
            }

            long[] result = maxSubarray(arr);

            for (int i = 0; i < result.length; i++) {
                // bufferedWriter.write(String.valueOf(result[i]));
                bufferedWriter.write(Long.toString(result[i]));

                if (i != result.length - 1) {
                    bufferedWriter.write(" ");
                }
            }

            bufferedWriter.newLine();
        }

        bufferedWriter.close();

        scanner.close();
    }
}