[LeetCode]Maximum Subarray

2023. 5. 21. 17:07·SW개발/코딩테스트

https://leetcode.com/problems/maximum-subarray/

 

Maximum Subarray - LeetCode

Can you solve this real interview question? 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 t

leetcode.com

 

문제 분석

주어진 nums 리스트에서 숫자들의 합이 최대가 되는 subarray를 구하는 문제입니다. 가장 큰 연속된 부분 배열의 합을 구합니다.

 

처음 시도한 답안

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        max_sum = nums[0]

        for idx in range(1, len(nums)):
            # 현재 값이 더 크다면 이전까지의 subarray를 포기하고 새롭게 시작
            # 현재 값이 이전+현재 보다 작다면 subarray를 확장함
            if nums[idx-1] + nums[idx] > nums[idx]:
                # nums 배열의 값을 바꾸어주는 것으로 subarray를 기록하는 효과를 얻음
                # 현재까지의 subarray의 sum된 값을 기록하는 것
                nums[idx] = nums[idx-1] + nums[idx]
            
            # 위 조건을 수행후 max_sum 최신화
            max_sum = max(max_sum, nums[idx])

        return max_sum

접근 방법

  1. 처음 숫자를 최댓값으로 설정합니다.
  2. 두번째 요소부터 반복을 순회합니다.
  3. 현재 반복에서 등장한 값이 이전까지의 subarray(이 값에는 이전까지의 최댓값이 담겨져 있음) 보다 크다면
    이전까지의 subarray를 버리고 새롭게 시작합니다.
  4. 아니라면 nums 배열의 값을 바꾸면서, subarray의 sum값을 기록하도록 합니다.
  5. 그 이후 max_sum 값을 갱신합니다.

반복을 순회하면서 nums 배열에 subarray를 선택한 경우에 sum 값을 누적해서 기록해주면서 max_sum을 구하는 방법입니다. 예시는 다음과 같습니다.

 

반복을 순회하기 전 -> nums = [-2, 1, -3, 4, -1, 2 ,1, -5, 4]

반복을 모두 순회하고 난 뒤 -> nums = [-2, 1, -2, 4, 3, 5, 6, 1, 5]

 

 

 

nums[3] 요소를 보면 전과 후 모두 4로 동일합니다. 그 이유는 nums[0~2] 까지의 요소들의 합보다 nums[3]에서 등장한 요소 자체가 더 큰 값을 가지기 때문입니다. 따라서 이전까지의 합을 무시하고 nums 배열의 값을 조작하지 않도록 하여 subarray를 새롭게 선택하는 효과를 가지게 합니다. 

 

이런식으로 반복을 완료하면 최대 값을 구할 수 있습니다.

 

두번째로 시도한 답안

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        max_sum = current_max_subarray = nums[0]

        for num in nums[1:]:    
            # 현재 등장한 숫자와 현재 + 이전까지의 누적 합계를 더한것중 큰것을 선택
            current_max_subarray = max(num, num + current_max_subarray)
            # 최대 합계를 갱신
            max_sum = max(max_sum, current_max_subarray)

        return max_sum

접근 방법

  1. 기본적인 방식은 첫번째와 동일합니다.
  2. 조건문을 단순화하고, current_max_subarray 변수를 통해 조금 더 직관적이게 했습니다.

 

728x90

'SW개발 > 코딩테스트' 카테고리의 다른 글

[LeetCode]Spiral Matrix II  (0) 2023.05.23
[LeetCode]Spiral Matrix  (0) 2023.05.22
[LeetCode]Group Anagrams  (0) 2023.05.10
[LeetCode]Rotate Image  (0) 2023.05.09
[LeetCode]Permutations  (0) 2023.05.08
'SW개발/코딩테스트' 카테고리의 다른 글
  • [LeetCode]Spiral Matrix II
  • [LeetCode]Spiral Matrix
  • [LeetCode]Group Anagrams
  • [LeetCode]Rotate Image
Leffe_pt
Leffe_pt
개발자로서 성장하면서 배워온 지식과 경험을 공유하는 공간입니다.
  • Leffe_pt
    Leffe's tistory
    Leffe_pt
  • 전체
    오늘
    어제
    • 분류 전체보기 (309)
      • SW개발 (305)
        • 코딩테스트 (172)
        • 개발이야기 (23)
        • IT 용어 (17)
        • Python (22)
        • Django (46)
        • Flask (2)
        • Database (3)
        • SQLAlchemy (0)
        • Javascript (5)
        • Linux, Unix (3)
        • JAVA (2)
        • Spring (10)
      • 회고 (4)
      • 사진 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    컨트리뷰터
    트리 #AVL #알고리즘 #자료구조
    어플리케이션
    Contributor
    배공파용
    django
    배달비 공유
    오픈소스
    라이프 스타일
    플레이스토어
    배달
    g
    음식
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Leffe_pt
[LeetCode]Maximum Subarray
상단으로

티스토리툴바