https://leetcode.com/problems/subarray-sum-equals-k/
==문제==
nums배열에서 더해서 k가 되는 부분 배열의 가짓수를 구하는 문제이다.
==풀이==
누적합계인 sums를 선언해서 합계에 어떤 숫자가 더해질 때마다 sums-k 값을 구한다.
이 값이 이 전에 구했던 sums의 이력 중 어떤 것이라도 일치하는 게 있다면 부분 배열 개수를 +1 해준다.
nums=[2,1,2,3]이고 k=3이라고 했을 때, 정답은 [2,1], [1,2], [3]으로 3이 나와야 한다.
누적합계 sums의 제일 처음 값은 0이니까 전체 이력은 [0,2,3,5,8]인데 0->3으로 갈 때, 2->5로 갈 때, 5->8로 갈 때 총 3가지 경우로 정답과 일치한다.
몇 단계를 거치건 0이나 2 혹은 5에서 +3 이 되는 값이 되기만 한다면 그 부분 배열은 더해서 3이 된다.
이번엔 nums=[1,0,-1,0]이고 k=0인 경우를 생각해보자.
이 경우는 [0], [1,0,-1], [0], [1,0,-1,0] 총 4가 나와야 한다.
누적합계 sums는 [0,1,1,0,0]으로 sums[0]에서 [3]과 [4]로 갈 때, sums[3]에서 [4]로 갈 때, sums[1]에서 [2]로 갈 때 총 4가지로 정답과 일치한다.
이 경우는 첫 번째 경우와 다르게 동일한 누적 합계 이력이 존재한다.
그래서 sums의 이력을 저장한 sumDict에 동일한 키 값이 존재하면 값을 하나씩 증가시킨다.
==코드==
class Solution:
def subarraySum(self, nums: List[int], k: int) -> int:
cnt = 0
sums = 0 # 누적 합계
sumDict = {0:1} # hash
for num in nums:
sums = sums + num
cnt = cnt + sumDict.get(sums-k, 0)
sumDict[sums] = sumDict.get(sums, 0) + 1
return cnt
sumDict.get()을 이용해 키 값에 해당하는 값을 가져오고 키가 존재하지 않는다면 0을 가져온다.
(현재 누적합계 - k)를 키로 설정해서 sumDict에 저장된 합계 이력이 없다면 cnt는 증가되지 않을 것이고 합계 이력이 존재하면 cnt + 1이 된다.
동일한 합계 이력이 있을 경우엔 그 값을 증가시켜줘야 하기 때문에 동일하게 dict.get()을 이용해 현재 누적합계를 키로 설정해서 값이 있다면 1을 증가시킨다.
'알고리즘' 카테고리의 다른 글
[Python] 리트코드 1340. Jump Game V (Sorting, DP) (0) | 2021.08.08 |
---|---|
[Python] 리트코드 1022. Sum of Root To Leaf Binary Numbers(DFS) (0) | 2021.08.03 |
[Python] 리트코드 1048. Longest String Chain (요소의 길이로 정렬) (0) | 2021.07.19 |
[Python] 리트코드 39. Combination Sum (Array) (0) | 2021.07.12 |
[Python] 리트코드 1002 : Find Common Characters (String) (0) | 2021.07.11 |