읽기 전
- 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다.
- 개인적으로 배운 점을 정리한 글입니다.
문제 링크
문제 풀이
처음엔 부분합 문제로 A와 B의 모든 부분 배열의 합을 배열로 저장하고 A의 모든 원소에 대해 탐색 배열을 B의 부분배열의 합 배열로 두고 타겟 - A의 부분합 배열의 원소
값을 이진 탐색으로 찾아서 해결할 수 있을 줄 알았다. 그야 메모리 제한이 64MB라서 공간복잡도가 작아보였기 때문...
그러나 이 문제는 A의 부분합을 배열로 생성하고 B의 부분합은 dictionary로 생성하여 탐색 과정을 $O(1)$로 줄여야 하는 문제였다. C계열 언어였다면 통과했을 지 몰라도 python에서는 시간 초과가 발생하기 때문이다. 그럴만도 한게 부분합 배열은 엄연히 $O(n^2)$이고 매번 B의 배열을 이진탐색으로 찾으면 탐색과정은 대충 $2log\ n$이 되는데 상당히 버거울 만도 하다. A의 부분합 배열에 대해 순차적으로 탐색하여 B 부분합 딕셔너리에 타겟 - A 부분합 배열의 원소
키를 조회하여 더하면 되겠다.
python 코드
import sys
from collections import defaultdict
input = sys.stdin.readline
T = int(input())
N = int(input())
A = list(map(int, input().split()))
M = int(input())
B = list(map(int, input().split()))
sum_A, sum_B = [], defaultdict(int)
for i in range(1, N):
l, r = 0, i
buf = sum(A[l:r])
sum_a.append(buf)
while r < N:
buf -= A[l]
buf += A[r]
sum_a.append(buf)
l += 1
r += 1
for i in range(1, M):
l, r = 0, i
buf = sum(B[l:r])
sum_b[buf] += 1
while r < M:
buf -= B[l]
buf += B[r]
sum_b[buf] += 1
l += 1
r += 1
sol = 0
for s_a in sum_a:
sol += sum_b[T - s_a]
print(sol)
'Algorithms > Baekjoon' 카테고리의 다른 글
BOJ #1149 RGB 거리 (0) | 2021.07.26 |
---|---|
BOJ #3020 개똥벌레 (0) | 2021.07.19 |
BOJ #12015 가장 긴 증가하는 부분 수열 2 (0) | 2021.07.15 |
BOJ #1655 가운데를 말해요 (0) | 2021.07.15 |
BOJ #1300 K번째 수 (0) | 2021.07.13 |