Processing math: 100%

읽기 전

  • 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다.
  • 개인적으로 배운 점을 정리한 글입니다.

문제 링크

문제 2143. 두 배열의 합

문제 풀이

처음엔 부분합 문제로 A와 B의 모든 부분 배열의 합을 배열로 저장하고 A의 모든 원소에 대해 탐색 배열을 B의 부분배열의 합 배열로 두고 타겟 - A의 부분합 배열의 원소값을 이진 탐색으로 찾아서 해결할 수 있을 줄 알았다. 그야 메모리 제한이 64MB라서 공간복잡도가 작아보였기 때문...

그러나 이 문제는 A의 부분합을 배열로 생성하고 B의 부분합은 dictionary로 생성하여 탐색 과정을 O(1)로 줄여야 하는 문제였다. C계열 언어였다면 통과했을 지 몰라도 python에서는 시간 초과가 발생하기 때문이다. 그럴만도 한게 부분합 배열은 엄연히 O(n2)이고 매번 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

+ Recent posts