본문 바로가기

백준 - 부분수열의 합 2 (1208) 본문

알고리즘

백준 - 부분수열의 합 2 (1208)

Seongjun_You 2023. 12. 27. 19:34

처음 더한다, 더하지 않는다 두 가지 경우의 수로 재귀 함수를 돌렸으나

시간초과 문제로 다른 방법을 모색하게 된다.

 

1. 수열을 반으로 자른다.

[-7, -3, -2, 5, 8] =>  [-7, -3] , [-2, 5, 8]

 

2. 부분수열을 구하고 정렬한다.

[-10, -7, -3]      [-2, 3, 5, 6, 8, 11, 13]

 

3. 이분탐색으로 데이터를 하나씩 찾아준다.

bisect을 이용해서 right - left를 하면 중복 요소개수까지 구할 수 있다.

 

4. 자기 자신도 탐색을 진행한다.

 

from itertools import combinations
from bisect import bisect_left, bisect_right
def find_idx(list_data, data):
    return bisect_right(list_data, data) - bisect_left(list_data, data) # 중복 요소까지 계산

n,m = map(int, input().split())
data = list(map(int, input().split()))

ldata = data[:n//2]
rdata = data[n//2:]
l_sum_list = []
r_sum_list = []

for i in range(len(ldata)+1):
    for com in combinations(ldata,i):
        l_sum_list.append(sum(com))

for i in range(len(rdata)+1):
    for com in combinations(rdata,i):
        r_sum_list.append(sum(com))

l_sum_list = sorted(l_sum_list[1:])
r_sum_list = sorted(r_sum_list[1:])
answer = 0
for i in l_sum_list:
    answer += find_idx(r_sum_list,m-i)
answer += find_idx(l_sum_list,m)
answer += find_idx(r_sum_list,m)
print(answer)

 

'알고리즘' 카테고리의 다른 글

백준 - ACM Craft (1005)  (0) 2023.12.28
백준 - 줄 세우기 (2252)  (0) 2023.12.27
프로그래머스 - 길 찾기 게임  (1) 2023.12.21
백준 - 전깃줄 - 2(2568)  (0) 2023.12.12
백준 - 멀티탭 스케줄링(1700)  (0) 2023.12.12
Comments