2021. 3. 31. 18:28ㆍ프로그래밍-코딩테스트/LeetCode
연속된 element로 구성된 nums의 부분집합 중, 합이 k가 되는 부분집합의 갯수를 리턴하라
각 부분합을 원소로 표현한 sum이라는 배열을 만들고, map이라는 딕셔너리를 만들었다.
그 후 sum에서 k를 뺀 값이 key로 딕셔너리에 존재하면 answer를 하나 추가해주었고,
그렇지 않으면 sum만 딕셔너리에 추가해주었다.
사실 골머리를 앓았던 문제라서 도식으로 정리해보았다.
두번째를 예시로 들어본다.
[ 0, 1, 2, 3 ]이라는 배열이 들어왔을 때, 각 element를 연쇄적으로 더한 sum이라는 배열을 만들었다.
얘는 [ 0, 1, 3, 6 ]이 될 것이다.
실제 주어진 배열은 [ 1, 2, 3 ] 이지만 1개의 원소만 가진 부분합도 카운팅되므로 편의상 0을 넣었다.
저렇게 만든 sum 배열을 확인해보면 6-3과, 3-0이 k의 값과 같아진다.
이는 nums의 0번,1번,2번 원소의 합과 3번 원소의 합(1개의 원소)이 k가 됨을 의미한다
왜냐하면 사실 저 배열은 [ num0 , num0+ num1 , num0+num1+num2, num0+num1+num2+num3] 이다.
만약 k=2로 주어진다면, (num0+num1+num2+num3) - (num0+ num1 )=2가 될것이다.
이 말의 뜻은 num2와 num3이라는 연속된 element로 구성된 부분합이 조건에 맞다는 뜻이 된다.
이러한 이유로 sum-k가 sum에 key로 존재할때 answer를 카운팅해주는 것이다.
정확히는 n번째 루프에서 sum[n] - sum[m] = key 조건을 만족하는 m이 존재하는지를 살피는 것이다.
'프로그래밍-코딩테스트 > LeetCode' 카테고리의 다른 글
[Array, Greedy] Jump Game II (0) | 2021.04.01 |
---|---|
[Array, Greed] Jump Game (0) | 2021.04.01 |
[DP] Longest Palindromic Substring (0) | 2021.03.31 |
[Array] 3Sum (0) | 2021.03.31 |
[DP] Coin Change (1) | 2021.03.31 |