LeetCode는 소프트웨어 엔지니어링 및 코딩 인터뷰 준비를 위한 플랫폼이다. 다양한 프로그래밍 언어로 구현된 코딩 문제가 공하며 알고리즘 능력을 향상시키는데 도움을 준다.
LeetCode에 수 많은 문제 중에 시간을 절약하기 위해 New Year Gift – Curated List of Top 75 LeetCode Questions to Save Your Time 에서 각 카테고리/유형 별로 추천하는 75개 문제를 풀어본다.
이번 글에서는 Array문제인 Maximum Product Subarray 문제를 python으로 풀어보았다.
목차
Leetcode 문제설명
이 문제는 정수 배열 nums가 주어졌을 때, 배열 내에서 부분배열의 곱 중에서 가장 큰 값을 찾고, 그 최대 곱을 반환하는 문제이다. 부분배열은 배열 내에서 연속된 원소들로 이루어진 것을 의미한다.
해당 문제는 ttps://leetcode.com/problems/maximum-product-subarray/ 에서 확인 할 수 있습니다.
예를 들어, 주어진 배열이 [2, 3, -2, 4]일 때, 이 배열에서의 부분배열 중 곱이 가장 큰 경우는 [2, 3]이며, 해당 부분배열의 곱은 6이다. 따라서 이 문제에서 함수는 6을 반환해야 한다.
제약사항은 다음과 같다.
배열의 길이는 최소 1이며 최대 2 * 10^4
배열의 각 원소는 -10에서 10까지의 정수
배열의 어떤 접두사(prefix)나 접미사(suffix)의 곱도 32비트 정수에 들어갈 수 있는 값으로 보장
솔루션
다음 코드는 이중 반복문을 사용하여 가능한 모든 부분배열의 곱을 계산하므로 시간 복잡도가 O(n^2)이다. 배열의 크기가 커질수록 실행 시간이 급격하게 증가하며, 효율성이 낮다.
class Solution: def maxProduct(self, nums: List[int]) -> int: # 입력 배열이 비어있으면 0을 반환 if not nums: return 0 # 배열의 길이를 구함 n = len(nums) # 최대 곱을 음의 무한대로 초기화 max_product = float('-inf') # 배열의 각 인덱스에 대해 반복 for i in range(n): # 현재 부분배열의 곱을 저장하는 변수 초기화 current_product = 1 # 현재 인덱스 i에서 시작하여 배열의 끝까지 반복 for j in range(i, n): # 현재 부분배열 곱에 현재 인덱스 j의 값을 곱함 current_product *= nums[j] # 최대 곱을 현재 부분배열 곱과 기존 최대 곱 중 더 큰 값으로 갱신 max_product = max(max_product, current_product) # 최종적으로 계산된 최대 부분배열 곱 반환 return max_product
다음 코드는 동적 프로그래밍의 아이디어를 활용하여 최대 연속 부분 배열 곱을 찾는다. 주요 알고리즘는 각 원소마다 최대값과 최소값을 유지하면서 순회하는 것이다. 음수가 등장할 경우 최대값과 최소값을 교환하는 이유는 음수가 하나 등장할 때 최대값과 최소값의 부호가 바뀌면서 절댓값이 커질 수 있기 때문이다.
이 알고리즘은 한 번의 순회로 해결되므로 시간 복잡도는 O(N)으로 보다 효율적으로 풀 수 있다.
class Solution: def maxProduct(self, nums: List[int]) -> int: # 입력이 빈 배열인 경우 0을 반환 if not nums: return 0 # 첫 번째 원소로 시작 max_product = min_product = result = nums[0] # 배열의 두 번째 원소부터 순회 for num in nums[1:]: # 현재 원소가 음수인 경우, 최대값과 최소값을 교환 if num < 0: max_product, min_product = min_product, max_product # 최대값과 최소값 갱신 max_product = max(num, max_product * num) min_product = min(num, min_product * num) # 현재까지의 최대값 갱신 result = max(result, max_product) # 최종적으로 최대 연속 부분 배열 곱 반환 return result
다음 문제는 Minimum in Rotated Sorted Array 입니다. 읽어주셔서 감사합니다.