본문 바로가기
알고리즘

백준 1806번: 부분합 (python, 파이썬)

by 블쭌 2020. 10. 24.
728x90
  • 문제

10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오.


  • 입력

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


  • 출력

첫째 줄에 구하고자 하는 최소의 길이를 출력한다. 만일 그러한 합을 만드는 것이 불가능하다면 0을 출력하면 된다.


  • 코드
n, m = map(int, input().split())
num = list(map(int, input().split()))

start = 0
end = 0
answer = num[0]
cnt = 1
minimum = 1e+5+1

while start < n:
	# m보다 같거나 크면 길이가 최소인지 확인
    if answer >= m:
        minimum = min(minimum, cnt)
    
    # m보다 같거나 크고 end가 전진하다가 마지막 index일때
    # start지점 추가
    if answer >= m or end == n-1:
        answer -= num[start]
        start += 1
        cnt -= 1
        
    # m보다 작을때 end를 전진
    else:
        end += 1
        answer += num[end]
        cnt += 1
print(0 if minimum == 1e+5+1 else minimum)

  • 출처

www.acmicpc.net/problem/1806

728x90

댓글