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

 

1806번: 부분합

첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.

www.acmicpc.net


내 풀이

시도1

import sys
input = sys.stdin.readline
def solution():
    n,s = map(int,input().split())
    candi = list(map(int,input().split()))
    
    answer=[]

    for i in range(len(candi)):
        m_sum=0
        count =1
        m_sum += candi[i]
        for j in range(i+1,len(candi)):
            if m_sum == s:
                answer.append(count)
                break
            elif m_sum > s:
                break
            m_sum += candi[j]
            count +=1
    return min(answer)
    



print((solution()))

사실 아무생각없이 이중루프를 돌렸는데 이제와서 생각해보니까 안되는게 당연하다. 항상 문제조건을 보고 문제를풀자

 

두번째시도

 

def solution():
    n,s =  map(int,input().split())

    lists = list(map(int,input().split()))
    sum_parts= 0
    starts=0
    ends=0
    answer=int(1e9)
    while True:
        if sum_parts >= s:
            answer = min(answer,ends-starts)
            
            sum_parts -=lists[starts]
            starts +=1
        else:
            if n==ends:
                break
            sum_parts +=lists[ends]
            ends +=1

    print(0 if answer==1e9 else answer)
    
    
solution()

 

두번째는 시간초과를 막기위하여 이중루프를 없앴다. 풀다보니 예전에 부분합 풀었던 기억이 있어서 더듬더듬 풀었다..

찾아보니 투 포인터라는 알고리즘이라고 한다.


 


다른사람의 풀이

 



 

'취준 > 백준' 카테고리의 다른 글

1939(중량제한) - 파이썬  (0) 2022.11.01
10816(숫자카드 2) - 파이썬  (0) 2022.10.27
1238 - 파이썬  (0) 2022.10.24
25755 - 파이썬  (0) 2022.10.21
1912(연속합) - 파이썬  (0) 2022.10.18

+ Recent posts