< 풀이 순서 >
- 모든 부분합은 으로 처리 가능하다.
- 딕셔너리에 모든 부분합의 갯수를 기록한다.
- 한쪽 딕셔너리의 값을 가져와 다른 딕셔너리 뺀 값이 존재하면 두 딕셔너리의 합은
T
이다.- 조합의 수는 중복된 합의 개수를 서로 곱하면 된다.
t = int(input())
n = int(input())
a = list(map(int, input().split()))
m = int(input())
b = list(map(int, input().split()))
a_dic = dict()
b_dic = dict()
for i in range(n):
sm = 0
for j in range(i, n):
sm += a[j]
if not a_dic.get(sm):
a_dic[sm] = 1
else:
a_dic[sm] += 1 # 같은 합의 갯수를 셀 수 있다.
for i in range(m):
sm = 0
for j in range(i, m):
sm += b[j]
if not b_dic.get(sm):
b_dic[sm] = 1
else:
b_dic[sm] += 1
result = 0
for a_val in a_dic:
if b_dic.get(t - a_val):
result += a_dic[a_val] * b_dic[t - a_val]
print(result)
< 풀이 순서 >
1. Bisect를 사용하기 위해 사용할 부분합 리스트를 정렬해준다.
2.(목표값 - a)
인 b 가 존재하면 해당 값의 중복 갯수를 세준다.
3. 이를 결과값에 더해준다.
import bisect
t = int(input())
n = int(input())
a = list(map(int, input().split()))
m = int(input())
b = list(map(int, input().split()))
a_sum, b_sum = [], []
for i in range(n):
sm = 0
for j in range(i, n):
sm += a[j]
a_sum.append(sm)
for i in range(m):
sm = 0
for j in range(i, m):
sm += b[j]
b_sum.append(sm)
b_sum.sort()
count = 0
for a in a_sum:
upper = bisect.bisect_right(b_sum, t - a)
lower = bisect.bisect_left(b_sum, t - a)
count += (upper - lower)
print(count)
부분합
을 만에 구할 수 있어야 한다.딕셔너리
를 통해 중복된 값의 수를 표현한다.Bisect
를 통해 중복된 값의 수를 표현한다.suri78님 블로그