๏นฅ

Leetcode 1191. K-Concatenation Maximum Sum (Python3)

@๋‚จ์ œ์ด ยท 2024๋…„ 07์›” 12์ผ ยท 6๋ถ„
problem_solvingleetcodepython

๋ฌธ์ œ ๋งํฌ

https://leetcode.com/problems/k-concatenation-maximum-sum/description/

๋ฌธ์ œ ์š”์•ฝ

์ •์ˆ˜ ๋ฐฐ์—ด์ธ arr ๊ณผ ์ •์ˆ˜ k ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
arr ์„ k ๋งŒํผ ๋ฐ˜๋ณตํ•ด์„œ ๋ฐฐ์—ด์„ ์ˆ˜์ •ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, arr = [1, 2] ์ด๊ณ  k = 3 ์ผ ๊ฒฝ์šฐ ์ˆ˜์ •๋œ ๋ฐฐ์—ด์€ [1, 2, 1, 2, 1, 2] ์ด ๋œ๋‹ค.


๋‹ค์Œ์œผ๋กœ ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ๋ฐฐ์—ด ์•ˆ์—์„œ sub-array ๋ฅผ ๊ตฌํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, [1, 2, 1, 2, 1, 2] ์ด ์žˆ๋‹ค๊ณ  ํ•  ๊ฒฝ์šฐ sub-array ๋Š” [1, 2, 1], [2, 1, 2] ๋“ฑ ์—ฌ๋Ÿฌ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ, ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” sub-array ์˜ ๋ฐฐ์—ด ์ค‘์—์„œ ์›์†Œ์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ๊ฐ’์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.
์œ„์˜ ์˜ˆ์‹œ์—์„œ sub-array ์˜ ์›์†Œ์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ๋Š” [1, 2, 1, 2, 1, 2] ๊ฐ€ ๋˜์–ด ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” sub-array ์˜ ํ•ฉ์€ 9 ๊ฐ€ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ฃผ์–ด์ง„ ๋ฐฐ์—ด๊ณผ k ๊ฐ’์„ ํ†ตํ•ด sub-array ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์ค‘ ์›์†Œ์˜ ํ•ฉ์ด ๊ฐ€์žฅ ํฐ ๊ฒฝ์šฐ๋ฅผ ์ฐพ์œผ๋ฉด ๋œ๋‹ค.


์กฐ๊ฑด์„ ๋ณด๋ฉด arr ์˜ ๊ธธ์ด๋Š” ์ตœ๋Œ€ 10^5 ๊ทธ๋ฆฌ๊ณ  k ๋Š” ์ตœ๋Œ€ 10^5 ์˜ ๊ฐ’์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ arr ์˜ ๊ธธ์ด๊ฐ€ 10^10 ์ด ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ํ•ฉ์ด ๋„ˆ๋ฌด ํด ๊ฒฝ์šฐ ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ํ†ตํ•ด (10**9)+7 ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.


ํ•œ ๊ฐ€์ง€ ์œ ์˜ํ•˜๋ฉด์„œ ํ’€์–ด์•ผ ํ•  ๋ถ€๋ถ„์€ ๋งˆ์ด๋„ˆ์Šค์ธ ์ •์ˆ˜๊ฐ€ ์˜จ๋‹ค๊ณ  ํ•ด๋„ ์ œ์™ธํ•˜๋ฉด ์•ˆ๋œ๋‹ค๋Š” ์ ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, [-1, -1, 1, 2, 3, -1, -1, 1, 2, 3] ์ผ ๊ฒฝ์šฐ ์›์†Œ์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” sub-array ๋Š” ์ „์ฒด๊ฐ€ ๋˜์–ด ๋ชจ๋“  ์›์†Œ๋ฅผ ๋”ํ•œ 10 ์ด ๋œ๋‹ค.


๋ฌธ์ œ ํ’€์ด

์ฒซ ๋ฒˆ์งธ ์‹œ๋„ - ์‹คํŒจ

์ฒซ ๋ฒˆ์งธ ์‹œ๋„์—์„œ๋Š” k ๋งŒํผ ๋ฐ˜๋ณต๋œ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋งŒํผ ํ•ฉ๊ณ„๋ฅผ ๊ตฌํ•ด์ฃผ๋ฉด์„œ ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ํ•ฉ๊ณ„๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ ค๊ณ  ํ–ˆ์—ˆ๋‹ค.
ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ๋Š” ๋‹ค ํ†ต๊ณผํ–ˆ์ง€๋งŒ ์ •๋‹ต์œผ๋กœ ์ œ์ถœํ•˜๋‹ˆ ๋ฐฐ์—ด์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •์—์„œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ด Runtime Error ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

  • ์‹คํŒจํ•œ ์ฝ”๋“œ

    class Solution:
        def kConcatenationMaxSum(self, arr: List[int], k: int) -> int:
            modulo = (10 ** 9) + 7
            k_arr = arr * k
            
            sum = 0
            max_sum = 0
    
            for i in range(len(k_arr)):
                sum += k_arr[i]
    
                if sum < 0:
                    sum = 0
    
                max_sum = max(max_sum, sum)
    
            return max_sum % modulo
  • Runtime Error

    image


๊ทธ๋ž˜์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด์ค‘ ๋ฐฐ์—ด๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ Time Limit Exceeded ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

  • Time Limit Exceeded

    image2


๋ฐฐ์—ด์˜ ๊ธธ์ด๋งŒํผ ๊ณ„์‚ฐ์„ ํ•˜๋‹ค๋ณด๋‹ˆ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(N) ์ด๊ณ  ๋ฐฐ์—ด์˜ ์ตœ๋Œ€ ๊ธธ์ด๋กœ ์ธํ•ด์„œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ผ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
์ œ์ถœ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ด๋„ k ๊ฐ€ 57011 ์ธ ๊ฒฝ์šฐ์˜ ์ผ€์ด์Šค์— ๋Œ€ํ•ด์„œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ๋‚˜์˜จ๋‹ค.
๊ฒฐ๊ตญ์—๋Š” ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.


๋‘ ๋ฒˆ์งธ ์‹œ๋„ - ์„ฑ๊ณต

๋‘ ๋ฒˆ์งธ ์‹œ๋„์—์„œ๋Š” ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๊ธฐ์—๋Š” ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ์ชผ๊ฐœ์„œ ๊ณ„์‚ฐ์„ ํ•ด์ค˜์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.
๊ทธ๋ž˜์„œ ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋“ค์„ ํ†ตํ•ด ์–ด๋–ค ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ ์ฐพ์•„๋ณด์•˜๋‹ค.


  1. k = 1 ์ธ ๊ฒฝ์šฐ

    arr = [-5,-2,0,0,3,9,-2,-5,4]
    k = 1

    ์ด ์ผ€์ด์Šค์˜ ๊ฒฝ์šฐ ๋ฐฐ์—ด์ด ํ•˜๋‚˜ ๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด ์•ˆ์—์„œ sub-array ์˜ ๊ฐ’์ด ๊ฐ€์žฅ ํฐ ๊ฒฝ์šฐ๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.



  2. k = 2 ์ธ ๊ฒฝ์šฐ

    arr = [1, -3, -4, 1]
    k = 2

    ์ด ์ผ€์ด์Šค์˜ ๊ฒฝ์šฐ sub-array ๊ฐ€ 2๊ฐœ์˜ ๋ฐฐ์—ด๋งŒ ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ๊ฐ ํ•ฉ์„ ๊ตฌํ•ด์„œ ๋”ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.



  1. k = 2 ์ด์ง€๋งŒ sub-array ๊ฐ€ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด ์—๋งŒ ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ

    arr = [-2, -3, 7, -1]
    k = 2

    ์ด ์ผ€์ด์Šค์˜ ๊ฒฝ์šฐ์—๋Š” sub-array ๋ฅผ ์ฐพ์•„๋ณด๋ฉด ์›์†Œ๊ฐ€ ํ•˜๋‚˜๋ฐ–์— ์—†๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  k = 1 ์ธ ๊ฒฝ์šฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ’€๋ฉด ๋œ๋‹ค.



  1. k >= 3 ์ด๊ณ  sub-array ๊ฐ€ ๋ชจ๋“  ๋ฐฐ์—ด์— ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ

    arr = [-5,-2,0,0,3,9,-2,-5,4]
    k = 4

    ์ด ์ผ€์ด์Šค์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๋ฐฐ์—ด์„ ๋‹ค ํฌํ•จํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–‘ ๋์— ์žˆ๋Š” ๋ฐฐ์—ด์˜ ํ•ฉ๊ณผ ๊ฐ€์šด๋ฐ ์žˆ๋Š” ๋ฐฐ์—ด์˜ ํ•ฉ์„ ๊ตฌํ•ด์„œ ๋”ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.


    image6



  1. k >= 3 ์ด์ง€๋งŒ sub-array ๊ฐ€ ๋‘ ๊ฐœ์˜ ๋ฐฐ์—ด ์—๋งŒ ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ

    arr = [1,-2,1]
    k = 5

    ์ด ์ผ€์ด์Šค์˜ ๊ฒฝ์šฐ sub-array ๊ฐ€ 2๊ฐœ์˜ ๋ฐฐ์—ด์—๋งŒ ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ์— k = 2 ์ธ ๊ฒฝ์šฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ’€๋ฉด ๋œ๋‹ค.


    image7



  1. k >= 3 ์ด์ง€๋งŒ sub-array ๊ฐ€ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด ์—๋งŒ ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ

    arr = [-5,4,-4,-3,5,-3]
    k = 3

    ์ด ์ผ€์ด์Šค์˜ ๊ฒฝ์šฐ์—๋Š” sub-array ๋ฅผ ์ฐพ์•„๋ณด๋ฉด ์›์†Œ๊ฐ€ ํ•˜๋‚˜๋ฐ–์— ์—†๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  k = 1 ์ธ ๊ฒฝ์šฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•ฉ์„ ๊ตฌํ•ด์ค€๋‹ค.
    ๊ทธ๋ฆฌ๊ณ  ๋˜ ํ•˜๋‚˜์˜ ์กฐ๊ฑด์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๊ฐ€์šด๋ฐ ๋ฐฐ์—ด์˜ ํ•ฉ์ด ์Œ์ˆ˜๊ฐ€ ๋˜๋ฏ€๋กœ ๊ฐ€์šด๋ฐ ๋ฐฐ์—ด์˜ ํ•ฉ์ด ์Œ์ˆ˜๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ํ™•์ธํ•ด์„œ ํ•ฉ์„ ๊ตฌํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.


    image8



  1. ์ด ์™ธ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋“ค

    • ๋ชจ๋“  ๋ฐฐ์—ด์˜ ์›์†Œ๊ฐ€ 10000 ์ธ ๊ฒฝ์šฐ
      • ์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” ๋ชจ๋“  ํ•ฉ์„ ๋”ํ•ด์„œ ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ํ†ตํ•ด sub-array ์˜ ํ•ฉ์„ ๊ตฌํ•ด์ฃผ์—ˆ๋‹ค.
    • ๋ฐฐ์—ด์˜ ์›์†Œ๊ฐ€ ๋ชจ๋‘ ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ
      • ๋ฌธ์ œ์˜ ์กฐ๊ฑด์— ๋งž๊ฒŒ 0 ์œผ๋กœ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

์œ„์™€ ๊ฐ™์€ ์—ฌ๋Ÿฌ ์ผ€์ด์Šค๋“ค์„ ์ •๋ฆฌํ•˜๊ณ ๋‚˜์„œ ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ์ฝ”๋“œ๋กœ ์˜ฎ๊ฒผ๋‹ค.

๋จผ์ € k = 1 ์ธ ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด์—์„œ sub-array ์˜ ์ตœ๋Œ€ ํ•ฉ์„ ๊ตฌํ•ด์ฃผ์—ˆ๋‹ค.

# k = 1 ์ธ ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด์—์„œ ์ตœ๋Œ€ ํ•ฉ๊ณ„ ๊ตฌํ•˜๊ธฐ
    def max_subarray_sum(arr: List[int]):
        cur_sum = 0
        max_sum = 0

        for num in arr:
            cur_sum = max(num, num+cur_sum)
            max_sum = max(max_sum, cur_sum)

        return max_sum

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ์œผ๋กœ k ๊ฐ€ 2 ์ด์ƒ์ด ๊ฒฝ์šฐ ์–‘ ๋์˜ ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ ๋ณ„๋„๋กœ ํ•ฉ์„ ๊ณ„์‚ฐํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
์ฒซ ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์›์†Œ๋ถ€ํ„ฐ ํ•ฉ์„ ๊ตฌํ•ด์•ผํ•˜๊ณ  ๋งˆ์ง€๋ง‰ ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ ๊ฐ€์žฅ ์ฒ˜์Œ ์›์†Œ๋ถ€ํ„ฐ ํ•ฉ์„ ๊ตฌํ•ด์ค˜์•ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ฉ์„ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.


image9


๋”ฐ๋ผ์„œ, ์ด์™€ ๊ฐ™์€ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.

# k = 2 ์ด์ƒ์ธ ๊ฒฝ์šฐ ๊ฐ€์žฅ ์•ž์˜ ๋ฐฐ์—ด์˜ ์ตœ๋Œ€ ํ•ฉ๊ณ„ ๊ตฌํ•˜๊ธฐ
# index = 0 ๋ถ€ํ„ฐ ์ตœ๋Œ€ ํ•ฉ๊ณ„๋ฅผ ๊ตฌํ•œ๋‹ค.
def max_prefix_sum(arr: List[int]):
    max_sum = 0
    cur_sum = 0

    for num in arr:
        cur_sum += num
        max_sum = max(cur_sum, max_sum)

    return max_sum

# k = 2 ์ด์ƒ์ธ ๊ฒฝ์šฐ ๊ฐ€์žฅ ๋’ค์˜ ๋ฐฐ์—ด์˜ ์ตœ๋Œ€ ํ•ฉ๊ณ„ ๊ตฌํ•˜๊ธฐ
# index = len(arr) ๋ถ€ํ„ฐ ์ตœ๋Œ€ ํ•ฉ๊ณ„๋ฅผ ๊ตฌํ•œ๋‹ค.
def max_suffix_sum(arr: List[int]):
    max_sum = 0
    cur_sum = 0

    for num in reversed(arr):
        cur_sum += num
        max_sum = max(cur_sum, max_sum)

    return max_sum

์ด์ œ ๊ฐ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ ๊ณ„์‚ฐ์„ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

k = 1 ์ธ ๊ฒฝ์šฐ

  • ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— arr ์•ˆ์—์„œ sub-array ์˜ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค.
max_one_sum = max_subarray_sum(arr=arr)

# k = 1 ์ธ ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด ๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ๋ฐฐ์—ด ์•ˆ์— subarray ์˜ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค. 
if k == 1:            
    return max_one_sum

k = 2 ์ธ ๊ฒฝ์šฐ

  • sub-array ๊ฐ€ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด ์•ˆ์— ์žˆ๋Š” ๊ฒฝ์šฐ์™€ 2๊ฐœ์˜ ๋ฐฐ์—ด์— ํฌํ•จ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ํ™•์ธํ•ด์„œ ํ•ฉ์„ ๊ตฌํ•ด์ค€๋‹ค.
# ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ์œ„ํ•œ ๊ณ„์‚ฐ
modulo = (10 ** 9) + 7

# k = 2 ์ธ ๊ฒฝ์šฐ ๋‘ ๊ฐœ์˜ ๋ฐฐ์—ด์ด ๋ถ™๊ธฐ ๋•Œ๋ฌธ์— ์•ž์˜ ๋ฐฐ์—ด๊ณผ ๋’ค์˜ ๋ฐฐ์—ด์˜ ํ•ฉ๊ณ„๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.
if k == 2:
    return max(max_one_sum, max_pre_sum + max_suf_sum) % modulo

k >= 3 ์ธ ๊ฒฝ์šฐ

  • ๋จผ์ € ์ค‘๊ฐ„ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ํ•ฉ์„ ๊ตฌํ•ด์ค€๋‹ค. ์ด ๋•Œ, ์ค‘๊ฐ„ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ํ•ฉ์€ ์•ž, ๋’ค ๋ฐฐ์—ด์„ ์ œ์™ธํ•œ k-2 ๊ฐœ์˜ ๋ฐฐ์—ด์ด ๋œ๋‹ค.
  • ์ค‘๊ฐ„ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ํ•ฉ์ด ์Œ์ˆ˜์ด๋ฉด sub-array ๊ฐ€ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด์— ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ์™€ 2๊ฐœ์˜ ๋ฐฐ์—ด์— ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
  • ์ค‘๊ฐ„ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ํ•ฉ์ด ์–‘์ˆ˜์ด๋ฉด sub-array ๊ฐ€ ์ „์ฒด ๋ฐฐ์—ด์— ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ์™€ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด์— ํฌํ•จ๋œ๋Š ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
# ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ์œ„ํ•œ ๊ณ„์‚ฐ
modulo = (10 ** 9) + 7

# k > 3 ์ธ ๊ฒฝ์šฐ ์•ž, ๋’ค์˜ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ํ•ฉ๊ณผ ์ค‘๊ฐ„ ๋ฐฐ์—ด์˜ ํ•ฉ์„ ๋น„๊ตํ•œ๋‹ค.
# ๊ฐ€์šด๋ฐ ๋ฐฐ์—ด์˜ ํ•ฉ์ด 0๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋ฐฐ์—ด์ด ํ•˜๋‚˜์ผ ๊ฒฝ์šฐ์™€ 2๊ฐœ์ผ ๊ฒฝ์šฐ๋ฅผ ๋น„๊ตํ•ด์„œ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค.
else:
    # ๊ฐ€์šด๋ฐ ๋ฐฐ์—ด์˜ ํ•ฉ, ์•ž ๋’ค์˜ ๋ฐฐ์—ด์ด 2๊ฐœ ๋น ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ์ˆ˜๋Š” k-2 ์ด๋‹ค.
    max_mid_sum = sum(arr) * (k-2)

    if max_mid_sum < 0:
        return max(max_one_sum, max_pre_sum + max_suf_sum) % modulo
    else:
        return max(max_one_sum, max_pre_sum + max_suf_sum + max_mid_sum) % modulo

์ œ์ถœ ๋‹ต์•ˆ

class Solution:
    def kConcatenationMaxSum(self, arr: List[int], k: int) -> int:
        # k = 1 ์ธ ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด์—์„œ ์ตœ๋Œ€ ํ•ฉ๊ณ„ ๊ตฌํ•˜๊ธฐ
        def max_subarray_sum(arr: List[int]):
            cur_sum = 0
            max_sum = 0

            for num in arr:
                cur_sum = max(num, num+cur_sum)
                max_sum = max(max_sum, cur_sum)

            return max_sum

        # k = 2 ์ด์ƒ์ธ ๊ฒฝ์šฐ ๊ฐ€์žฅ ์•ž์˜ ๋ฐฐ์—ด์˜ ์ตœ๋Œ€ ํ•ฉ๊ณ„ ๊ตฌํ•˜๊ธฐ
        # index = 0 ๋ถ€ํ„ฐ ์ตœ๋Œ€ ํ•ฉ๊ณ„๋ฅผ ๊ตฌํ•œ๋‹ค.
        def max_prefix_sum(arr: List[int]):
            max_sum = 0
            cur_sum = 0

            for num in arr:
                cur_sum += num
                max_sum = max(cur_sum, max_sum)

            return max_sum

        # k = 2 ์ด์ƒ์ธ ๊ฒฝ์šฐ ๊ฐ€์žฅ ๋’ค์˜ ๋ฐฐ์—ด์˜ ์ตœ๋Œ€ ํ•ฉ๊ณ„ ๊ตฌํ•˜๊ธฐ
        # index = len(arr) ๋ถ€ํ„ฐ ์ตœ๋Œ€ ํ•ฉ๊ณ„๋ฅผ ๊ตฌํ•œ๋‹ค.
        def max_suffix_sum(arr: List[int]):
            max_sum = 0
            cur_sum = 0

            for num in reversed(arr):
                cur_sum += num
                max_sum = max(cur_sum, max_sum)

            return max_sum

        # ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ์œ„ํ•œ ๊ณ„์‚ฐ
        modulo = (10 ** 9) + 7

        k_max_sum = 0

        max_one_sum = max_subarray_sum(arr=arr)

        # k = 1 ์ธ ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด ๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ๋ฐฐ์—ด ์•ˆ์— subarray ์˜ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค. 
        if k == 1:            
            return max_one_sum

        max_pre_sum = max_prefix_sum(arr=arr)
        max_suf_sum = max_suffix_sum(arr=arr)
        max_all_sum = sum(arr)
        
        # k = 2 ์ธ ๊ฒฝ์šฐ ๋‘ ๊ฐœ์˜ ๋ฐฐ์—ด์ด ๋ถ™๊ธฐ ๋•Œ๋ฌธ์— ์•ž์˜ ๋ฐฐ์—ด๊ณผ ๋’ค์˜ ๋ฐฐ์—ด์˜ ํ•ฉ๊ณ„๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.
        if k == 2:
            return max(max_one_sum, max_pre_sum + max_suf_sum) % modulo
        # k > 3 ์ธ ๊ฒฝ์šฐ ์•ž, ๋’ค์˜ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ํ•ฉ๊ณผ ์ค‘๊ฐ„ ๋ฐฐ์—ด์˜ ํ•ฉ์„ ๋น„๊ตํ•œ๋‹ค.
        # ๊ฐ€์šด๋ฐ ๋ฐฐ์—ด์˜ ํ•ฉ์ด 0๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋ฐฐ์—ด์ด ํ•˜๋‚˜์ผ ๊ฒฝ์šฐ์™€ 2๊ฐœ์ผ ๊ฒฝ์šฐ๋ฅผ ๋น„๊ตํ•ด์„œ ํ•ฉ์„ ๊ตฌํ•œ๋‹ค.
        else:
            # ๊ฐ€์šด๋ฐ ๋ฐฐ์—ด์˜ ํ•ฉ, ์•ž ๋’ค์˜ ๋ฐฐ์—ด์ด 2๊ฐœ ๋น ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ์ˆ˜๋Š” k-2 ์ด๋‹ค.
            max_mid_sum = sum(arr) * (k-2)

            if max_mid_sum < 0:
                return max(max_one_sum, max_pre_sum + max_suf_sum) % modulo
            else:
                return max(max_one_sum, max_pre_sum + max_suf_sum + max_mid_sum) % modulo

  • ์‹คํ–‰ ๊ฒฐ๊ณผ

image10