728x90

https://www.acmicpc.net/problem/2015

 

2015번: 수들의 합 4

첫째 줄에 정수 N과 K가 주어진다. (1 ≤ N ≤ 200,000, |K| ≤ 2,000,000,000) N과 K 사이에는 빈칸이 하나 있다. 둘째 줄에는 배열 A를 이루는 N개의 정수가 빈 칸을 사이에 두고 A[1], A[2], ..., A[N]의 순서로

www.acmicpc.net

# 시간 초과
# 슬라이싱해서 부분합 구하기
n, k = map(int, input().split())
a = list(map(int, input().split()))

cnt = 0
for i in range(n):
    for j in range(i+1,n+1):
        hap = a[i:j]
        if sum(hap) == k:
            cnt += 1
            
        # l = (list(itertools.islice(a,i,j)))
        # if sum(l) == k:
        #    cnt+=1
        
print(cnt)
# 메모리 초과
# 조합 
# [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]  => len(2)
# [(0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3)]  => len(3)
# [(0, 1, 2, 3)] => len(4)
# (x, ...., y) 중 y - x 가 len(2,3,4) - 1인 경우에만 n 에 삽입

import itertools
n, k = map(int, input().split())
a = list(map(int, input().split()))
cnt = 0
if k in a:
    cnt += 1

for i in range(2,n+1):
    m = list(itertools.combinations(range(len(a)),i))
    n = []

    for j in range(len(m)):
        if m[j][i-1]-m[j][0] == i-1:
            n.append ((a[m[j][0]],a[m[j][i-1]]))

    for j in range(len(n)):
        if sum(n[j]) == k:
            cnt += 1
print(cnt)
# 시간 초과 
# ([1], [1,2], [2,3,4]) ,([2],[2,3]), ([3,4], [5]) sum 비교
# ([1,2,3], [1,2,3,4], [4]) sum 비교
n, k = map(int, input().split())
a = list(map(int, input().split()))
cnt = 0
   
for i in range(n-1,0,-2):
    for j in range(n,i,-1):
        if sum(a[j-i-1:j]) == k:
            cnt += 1
        if sum(a[j-i-1:j-1]) == k:
            cnt += 1
        if j == 0 and sum(a[j:]) == k:
            cnt +=1

print(cnt)
반응형

'전.py' 카테고리의 다른 글

백준 12919 A와 B 2  (0) 2020.12.13
백준 1434 책 정리  (0) 2020.12.13
백준 1002 터렛  (0) 2020.12.13
백준 14888 연산자 끼워넣기  (0) 2020.12.13
백준 1697 숨바꼭질  (0) 2020.12.13
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기