ArithmeticSlices

Published at 2021-10-27

class Solution:
    def numberOfArithmeticSlices(self, nums: List[int]) -> int:
        minStart = len(nums) - 2  # 이 인덱스까지만 확인하면 됨(subarray길이가 최소 3이어야해서)
        if minStart < 1:
            return 0
        cnt = 0

        def isArithmetic(start, end, gap):
            for i in range(start + 1, end):
                if nums[i + 1] - nums[i] != gap:
                    return False
            return True

        for i in range(0, minStart):
            # 일단 [n,m,k]3개만 확인해서 맞다면 그 이후부턴 추가되는 애만 일정하게 증가하는지 확인하면 됨
            gap = nums[i + 1] - nums[i]
            last = nums[i + 2]
            if isArithmetic(i, i + 2, gap):
                cnt += 1
                for j in range(i + 3, len(nums)):
                    if nums[j] - last == gap:
                        cnt += 1
                        last = nums[j]
                    else:
                        break
            else:
                continue

        return cnt

    # subarray는 최소 3개 요소
    #   => subarray 의 시작점은 nums의 마지막 -2 까지만 보면 됨
    #      (마지막-1 마지막-2는 어차피 len=3이 안나오기땜에 볼필요x)
    # 이중반복문으로 subarray의 시작점, 끝점을 정해서 순열판별함수로 보내줌
    # 결과에 따라 cnt +1함

    # 넘 오래 걸려서 다시 짬
    # 시작점을 설정할때 len-2로 하는건 똑같
    # 근데 그 시작점부터 3개까지만 일단 확인해서 맞으면 다음으로 ㄱㄱ 아니라면 다음 시작점으로
    # 위에서 순열이 맞았다면 그 3개 이후는 추가되는 것만 하나씩 일정하게 증가하는지 확인하면 됨