๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm/Leetcode

๋งค์ผ LeetCode ํ’€๊ธฐ | Maximum Subarray

 

Given an integer array nums, find the 
subarray
 
with the largest sum, and return
 
its sum
.

 
Example 1:
Input: nums = [-2,1,-3,4,-1,2,1,-5,4] Output: 6 Explanation: The subarray [4,-1,2,1] has the largest sum 6.
Example 2:
Input: nums = [1] Output: 1 Explanation: The subarray [1] has the largest sum 1.
Example 3:
Input: nums = [5,4,-1,7,8] Output: 23 Explanation: The subarray [5,4,-1,7,8] has the largest sum 23.
 
Constraints:
1 <= nums.length <= 105-104 <= nums[i] <= 104

 

์•„์˜ˆ ์ ‘๊ทผ๋ฐฉ์‹์„ ๋ชจ๋ฅด๊ฒ ์–ด์„œ ๋ชปํ’€์—ˆ๋‹ค. 

 

๋ฐฐ์šด ์ฝ”๋“œ 

class Solution {
    func maxSubArray(_ nums: [Int]) -> Int {

        guard !nums.isEmpty else { return 0 }

        var currentSum = nums[0]
        var maxSum = nums[0]

        for i in 1..<nums.count {
            currentSum = max(nums[i], currentSum + nums[i])
            maxSum = max(currentSum, maxSum)
        }

        return maxSum
    }
}
์ ‘๊ทผ ๋ฐฉ์‹ 
1. ํ˜„์žฌ๊นŒ์ง€์˜ ํ•ฉ์„ ๋‚˜ํƒ€๋‚ด๋Š”, currentSum ๊ทธ๋ฆฌ๊ณ  maxSum์„ ๊ฐ๊ฐ nums[0]์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค. 
2. ๋ฐฐ์—ด ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆฐ๋‹ค. 
3. currentSum์€ nums[i] ๊ทธ๋ฆฌ๊ณ  currentSum+nums[i] ์ค‘์— ๋” ํฐ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค. 
4. maxSum์€ currentSum๊ณผ maxSum ์ค‘์— ๋” ํฐ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค. 
5. ์ตœ์ข…์ ์œผ๋กœ maxSum ๊ฐ’์„ return ํ•œ๋‹ค. 

 


 

์นด๋ฐ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ 

 

  • ๋ฌธ์ œ ์ •์˜:
    • ์ •์ˆ˜ ๋ฐฐ์—ด์—์„œ ์—ฐ์†๋œ ๋ถ€๋ถ„ ๋ฐฐ์—ด ์ค‘ ํ•ฉ์ด ์ตœ๋Œ€์ธ ๊ฒƒ์„ ์ฐพ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • ํ•ต์‹ฌ ์•„์ด๋””์–ด:
    • ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ, ๊ฐ ์œ„์น˜์—์„œ ๋๋‚˜๋Š” ์ตœ๋Œ€ ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํ•ฉ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
    • ์ด์ „๊นŒ์ง€์˜ ํ•ฉ์ด ์Œ์ˆ˜๋ผ๋ฉด ๋ฒ„๋ฆฌ๊ณ  ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ณ€์ˆ˜:
    • currentSum: ํ˜„์žฌ ์œ„์น˜๊นŒ์ง€์˜ ์ตœ๋Œ€ ๋ถ€๋ถ„ ๋ฐฐ์—ด ํ•ฉ
    • maxSum: ์ „์ฒด ๋ฐฐ์—ด์—์„œ ๋ฐœ๊ฒฌ๋œ ์ตœ๋Œ€ ๋ถ€๋ถ„ ๋ฐฐ์—ด ํ•ฉ
  • ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ ‘๊ทผ:
    • ๊ฐ ๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ(ํ˜„์žฌ๊นŒ์ง€์˜ ์ตœ๋Œ€ ํ•ฉ)๋ฅผ ์ด์šฉํ•ด ๋‹ค์Œ ๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  • ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ:
    • ์ „์ฒด ๋ฌธ์ œ์˜ ์ตœ์ ํ•ด๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ์ตœ์ ํ•ด๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

 

๋ฐฐ์—ด: [-2, 1, -3, 4, -1, 2, 1, -5, 4]

๋‹จ๊ณ„   ํ˜„์žฌ ์š”์†Œ   currentSum   maxSum   ์„ค๋ช…
1      -2          -2           -2      ์‹œ์ž‘
2       1           1            1      1 > -2 + 1, ์ƒˆ๋กœ ์‹œ์ž‘
3      -3          -2            1      1 + (-3) = -2
4       4           4            4      4 > -2 + 4, ์ƒˆ๋กœ ์‹œ์ž‘
5      -1           3            4      4 + (-1) = 3
6       2           5            5      3 + 2 = 5
7       1           6            6      5 + 1 = 6
8      -5           1            6      6 + (-5) = 1
9       4           5            6      1 + 4 = 5

์ตœ์ข… ๊ฒฐ๊ณผ: maxSum = 6
์ตœ๋Œ€ ๋ถ€๋ถ„ ๋ฐฐ์—ด: [4, -1, 2, 1]