0은 처리해줘야 하고, 양수는 곱해져도 어딜 slicing 하는지에 따라 부호가 바뀌지 않는다. 따라서 0이 아닌 값들을 쭉 이어서 길이를 기억한다. 첫번재 음수가 나오는 인덱스를 표시해놓고 현재 pointer 까지 곱연산이 양수이면 현재 까지 이어진 값의 길이와 max 를 비교해서 값을 갱신하고 음수라면 (pointer - 첫번째 음수 인덱스) 와 max 를 비교하여 갱신한다.
class Solution:
def getMaxLen(self, nums: list[int]) -> int:
pos = 0 # 0 if product is negative, 1 otherwise
result = 0 # maximum length of subarray
length = 0 # current length of subarray
neg_index = -1 # index of the first negative value in current subarray
for i in range(len(nums)):
if nums[i] == 0:
length = 0
neg_index = -1
pos = 0
elif nums[i] > 0:
if length == 0:
pos = 1
length += 1
if pos:
result = max(result, length)
else:
result = max(result, i - neg_index)
else:
if neg_index < 0:
neg_index = i
if length > 0:
pos ^= 1
length += 1
if pos:
result = max(result, length)
else:
result = max(result, i - neg_index)
return result