์ƒˆ์†Œ์‹

Algorithm/Programmers

[Java][ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] 161988, ์—ฐ์† ํŽ„์Šค ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ํ•ฉ

  • -
728x90

๐Ÿ‡ฑ๐Ÿ‡ป3๏ธโƒฃ, ์—ฐ์† ํŽ„์Šค ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ํ•ฉ[161988]

 

๐Ÿง€ ํ”„๋กœ์„ธ์Šค 

๋ฌธ์ œ ์„ค๋ช…
์–ด๋–ค ์ˆ˜์—ด์˜ ์—ฐ์† ๋ถ€๋ถ„ ์ˆ˜์—ด์— ๊ฐ™์€ ๊ธธ์ด์˜ ํŽ„์Šค ์ˆ˜์—ด์„ ๊ฐ ์›์†Œ๋ผ๋ฆฌ ๊ณฑํ•˜์—ฌ ์—ฐ์† ํŽ„์Šค ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๋งŒ๋“ค๋ ค ํ•ฉ๋‹ˆ๋‹ค. ํŽ„์Šค ์ˆ˜์—ด์ด๋ž€ [1, -1, 1, -1 …] ๋˜๋Š” [-1, 1, -1, 1 …] ๊ณผ ๊ฐ™์ด 1 ๋˜๋Š” -1๋กœ ์‹œ์ž‘ํ•˜๋ฉด์„œ 1๊ณผ -1์ด ๋ฒˆ๊ฐˆ์•„ ๋‚˜์˜ค๋Š” ์ˆ˜์—ด์ž…๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์ˆ˜์—ด [2, 3, -6, 1, 3, -1, 2, 4]์˜ ์—ฐ์† ๋ถ€๋ถ„ ์ˆ˜์—ด [3, -6, 1]์— ํŽ„์Šค ์ˆ˜์—ด [1, -1, 1]์„ ๊ณฑํ•˜๋ฉด ์—ฐ์† ํŽ„์Šค ๋ถ€๋ถ„์ˆ˜์—ด์€ [3, 6, 1]์ด ๋ฉ๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ์˜ˆ์‹œ๋กœ ์—ฐ์† ๋ถ€๋ถ„ ์ˆ˜์—ด [3, -1, 2, 4]์— ํŽ„์Šค ์ˆ˜์—ด [-1, 1, -1, 1]์„ ๊ณฑํ•˜๋ฉด ์—ฐ์† ํŽ„์Šค ๋ถ€๋ถ„์ˆ˜์—ด์€ [-3, -1, -2, 4]์ด ๋ฉ๋‹ˆ๋‹ค.
์ •์ˆ˜ ์ˆ˜์—ด sequence๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์—ฐ์† ํŽ„์Šค ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ํ•ฉ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฒƒ์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

๐Ÿ”ฝ ๋ฌธ์ œํ’€์ด

sequence ์˜ ๊ธธ์ด๊ฐ€ 500,000 ๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ์–ด์„œ ๋ฌด์ง€์„ฑ์œผ๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆฌ๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ  ํŽ„์Šค ์ˆ˜์—ด์„ ๊ณฑํ•ด์•ผ ํ•˜๋‹ˆ๊นŒ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ์™€ -1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ ๋‘๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ์ƒ๊ฐํ•œ ๊ณ ์•ˆ์€ ์ „์ฒด ๋ฐฐ์—ด์„ 1๋ถ€ํ„ฐ ๊ณฑํ•œ ๋ฐฐ์—ด ํ•œ๊ฐœ์™€ -1๋ถ€ํ„ฐ ๊ณฑํ•ฉ ๋ฐฐ์—ด ํ•œ๊ฐœ์— ๋Œ€ํ•œ ์ตœ๋Œ€ ์—ฐ์† ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ์•ˆํ–ˆ๋‹ค. ํ•˜๋‚˜ํ•˜๋‚˜ ์‚ดํŽด๋ณด์ž.

 

public static long maxSum(int[] arr) {
    long max = 0L;
    long[] dp = new long[arr.length];

    dp[0] = arr[0];
    max = arr[0];

    for(int i=1; i<dp.length; i++) {
        // ์ด์ „๊นŒ์ง€์˜ ์ตœ๋Œ€๊ฐ’ + ํ˜„์žฌ๊ฐ’ ๊ณผ ํ˜„์žฌ๊ฐ’์„ ๋น„๊ต
        dp[i] = Math.max(dp[i-1] + arr1[i], arr1[i]);
        max = Math.max(dp[i], max);
    }          

    return max;
}

 

์—ฐ์† ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ์ตœ๋Œ€ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์ด์ „๊นŒ์ง€์˜ ์ตœ๋Œ€๊ฐ’ + ํ˜„์žฌ ๊ฐ’, ํ˜„์žฌ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ dp ์— ์ €์žฅํ•˜๊ณ  max ์˜ ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ตœ๋Œ€ ํ•ฉ์„ ๋„์ถœํ–ˆ๋‹ค.

public long solution(int[] sequence) {
    int[] seq1 = new int[sequence.length];
    int[] seq2 = new int[sequence.length];

    for(int i=0; i<sequence.length; i++) {
        if(i%2==0) {
            seq1[i] = sequence[i];
            seq2[i] = sequence[i] * -1;
        } else {
            seq1[i] = sequence[i] * -1;
            seq2[i] = sequence[i];
        }
    }

    return maxSum(seq1, seq2);
}

 

์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด seq1 ์€ 1๋ถ€ํ„ฐ, seq2 ๋Š” -1๋ถ€ํ„ฐ ๊ณฑํ•œ ํŽ„์Šค ์ˆ˜์—ด์„ ๊ตฌํ˜„ํ•œ ํ›„, maxSum ์„ ํ†ตํ•ด ํ•œ๋ฒˆ์— ๋‹ต์„ ๋„์ถœํ–ˆ๋‹ค.

 

โœ… ์ „์ฒด์ฝ”๋“œ 

import java.util.*;
import java.util.stream.*;

public class Solution {
    public static void main(String[] args) {
       int[] sequence = {2,3,-6,1,3,-1,2,4};
       long answer = solution(sequence);
       System.out.println(answer);
    }

    static long solution(int[] sequence) {
        int[] seq1 = new int[sequence.length];
        int[] seq2 = new int[sequence.length];

        for(int i=0; i<sequence.length; i++) {
            if(i%2==0) {
                seq1[i] = sequence[i];
                seq2[i] = sequence[i] * -1;
            } else {
                seq1[i] = sequence[i] * -1;
                seq2[i] = sequence[i];
            }
        }

        return maxSum(seq1, seq2);
    }

    public static long maxSum(int[] arr1, int[] arr2) {
        long max = 0L;
        long[] dp1 = new long[arr1.length];
        long[] dp2 = new long[arr1.length];

        dp1[0] = arr1[0];
        dp2[0] = arr2[0];
        max = Math.max(arr1[0], arr2[0]);

        for(int i=1; i<dp1.length; i++) {
            // ์ด์ „๊นŒ์ง€์˜ ์ตœ๋Œ€๊ฐ’ + ํ˜„์žฌ๊ฐ’ ๊ณผ ํ˜„์žฌ๊ฐ’์„ ๋น„๊ต
            dp1[i] = Math.max(dp1[i-1] + arr1[i], arr1[i]);
            dp2[i] = Math.max(dp2[i-1] + arr2[i], arr2[i]);
            max = Math.max(max, Math.max(dp1[i], dp2[i]));
        }          

        return max;
    }
}

 

์›์†Œ์˜ ๊ฐ’์ด 100,000๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ตœ๋Œ€์˜ ๊ฒฝ์šฐ 100,000 X 500,000 = 50,000,000,000 ๋กœ int ์˜ ์ตœ๋Œ€ ๋ฒ”์œ„๋ฅผ ๋„˜์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ long ์„ ์‚ฌ์šฉํ•จ์— ์ฃผ์˜ํ•˜์ž

728x90
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.