본문 바로가기
코드

Target Sum

by ehei 2019. 12. 4.

https://leetcode.com/problems/target-sum/

주어진 값 S가 되도록 제시된 정수 집합으로 조합을 찾는 문제. 부호가 +,-가 될 수 있다. 어차피 모든 조합을 검사해야 하므로, 동적 프로그래밍 기법을 써서 반복 계산을 피해야 한다.

import collections


class Solution:
    def findTargetSumWays( self, nums, S: int ) -> int:
        if not nums:
            return 0

        # key: remain nums, value: sum cases
        caches = collections.defaultdict( lambda : collections.defaultdict( int ) )
        count, _ = self.__findTargetSumWays( nums, S, caches )

        return count


    def __findTargetSumWays( self, nums, S, caches ):
        if not nums:
            if S:
                return 0, {}
            else:
                return 1, {}
        else:
            key = tuple( nums )
            count = 0

            if key in caches:
                _caches = caches[ key ]

                for cache, _count in _caches.items():
                    if cache == S:
                        count += _count

                return count, _caches
            else:
                num = nums[ 0 ]
                remainNums = nums[ 1 : ]
                tempCaches = collections.defaultdict( int )

                for num in ( num, -num ):
                    _count, _caches = self.__findTargetSumWays( remainNums, S - num, caches )
                    count += _count

                    if not _caches:
                        tempCaches[ num ] += 1
                    else:
                        for cache, _count in _caches.items():
                            tempCaches[ num + cache ] += _count

                for num, _count in tempCaches.items():
                    caches[ key ][ num ] += _count

                return count, tempCaches

'코드' 카테고리의 다른 글

Valid Parentheses  (0) 2020.02.12
Min Stack  (0) 2020.02.12
Clone Graph  (0) 2019.11.26
Perfect Squares  (0) 2019.11.25
Open the Lock  (0) 2019.11.04