diff --git a/medium/dp/152.py b/medium/dp/152.py new file mode 100644 index 0000000..86f7831 --- /dev/null +++ b/medium/dp/152.py @@ -0,0 +1,34 @@ +# Maximum Product Subarray + +class Solution: + def maxProduct(self, nums: list[int]) -> int: + max_p = nums[0] + min_p = nums[0] + result = nums[0] + + for i in range(1, len(nums)): + now = nums[i] + + tmp_max_p = max_p + + max_p = max(now, now*tmp_max_p, now*min_p) + min_p = min(now, now*tmp_max_p, now*min_p) + + result = max(max_p, result) + + return result + +""" +걸린 시간: 몰라 + +복잡도: 리스트를 한번 순회하기 때문에 시간복잡도는 O(n)이고, 변수 3개만 선언해서 사용하기 때문에 공간복잡도는 O(1)이다. + +해설: 일단 자력으로 풀지 못하고 답을 확인했다. +구간에 음수 개수가 홀수냐 짝수냐와 0의 위치에 따라서 구간이 나눠진다고 생각했다. +지금까지 최대 양수와 최대 음수를 기억하면서 가보자라는 생각을 하긴 했었는데, 그 후로 더 하진 못했다. +정답은 너무 어렵게 생각할 필요없이, 음수 계산을 위해 현재까지의 최대값과 최소값을 기록하고, 2개의 값을 초기화하는 기준을 +현재 요소부터 시작할지/현재 요소를 최대값에 곱할지/현재 요소를 최소값에 곱할지 이다. +현재 요소를 무조건 쓴다가 전제인 이유는 안 쓴다면 다음 요소를 볼때 한 칸 떨어져버려서 부분배열이 되지 않기 때문이다. +즉, 이어지거나 말거나인데, 이어질거라면 음수인지 양수인지 모르니까 최대, 최소에 다 곱하라는 의미이다. +그리고 이렇게 이어지거나 말거나가 될 수 있으니까 전체로 보았을 때 최대를 result로 전체 기억도 한다. +""" \ No newline at end of file