728x90
2143번: 두 배열의 합
첫째 줄에 T(-1,000,000,000 ≤ T ≤ 1,000,000,000)가 주어진다. 다음 줄에는 n(1 ≤ n ≤ 1,000)이 주어지고, 그 다음 줄에 n개의 정수로 A[1], …, A[n]이 주어진다. 다음 줄에는 m(1 ≤ m ≤ 1,000)이 주어지고, 그
www.acmicpc.net
🤔 문제분석
누적합 + 이분탐색 문제로 누적합의 경우의 수를 모두 구한다음에 하나의 누적합을 순회하면서 다른 하나의 누적합의 경우의 수를 정렬한뒤 이분탐색하여 값을 찾아낸다.
이분탐색을 통하여 좌측 index와 우측 index 를 구한뒤에 (우측 - 좌측)을 통하여 해당 값이 몇개가 있는지 알 수 있다.
💻 코드
import sys
import bisect
input = sys.stdin.readline
T = int(input())
n = int(input())
A = [0]*n
for i, a in enumerate(list(map(int, input().split()))):
if i == 0:
A[i] = a
else:
A[i] = A[i-1] + a
m = int(input())
B = [0]*m
def prefix_sum(arr, s, e):
if s > 0:
return arr[e] - arr[s-1]
else:
return arr[e]
for i, b in enumerate(list(map(int, input().split()))):
if i == 0:
B[i] = b
else:
B[i] = B[i-1] + b
new_A = []
new_B = []
for i in range(n):
for j in range(i, n):
new_A.append((prefix_sum(A, i, j)))
for i in range(m):
for j in range(i, m):
new_B.append((prefix_sum(B, i, j)))
new_B.sort()
cnt = 0
for num in new_A:
left = bisect.bisect_left(new_B, T - num)
right = bisect.bisect_right(new_B, T - num)
cnt += right - left
print(cnt)
🎯 피드백 및 개선사항
좌측 인덱스와 우측 인덱스를 구하는과정에서 조금 헛갈린 부분이있어서 문제를 푸는데에 조금 오래걸렸다.
좌측 인덱스 구하는 방법 : T > cost 조건에서 마지막 mid을 인덱스로 지정한다.
우측 인덱스 구하는 방법 : T ≤ cost 조건에서 마지막 mid을 인덱스로 지정 한다.
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 17299번 : 오등큰수 (0) | 2024.02.23 |
---|---|
[백준] 2014번 : 소수의 곱 (0) | 2024.02.22 |
[백준] 1781번 : 컵라면 (0) | 2024.02.20 |
[백준] 1939번 : 중량제한 (0) | 2024.02.19 |
[백준] 1135번 : 뉴스전하기 (0) | 2024.02.18 |