백준 부분합 with python

2021. 4. 1. 19:56코딩테스트 준비

반응형

문제

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

입력

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

 

풀이

  • 처음과 끝을 변수로 두고 해당 값을 갱신해나가는 형태로 알고리즘 로직을 짜주면 된다
  • 임시 변수가 부분합보다 작을 경우에는 right=right+1을 통해 끝 변수를 늘려준다
  • 임시 변수가 부분합보다 클 경우에는 left=left+1을 통해 처음 변수를 늘려준다

 

# 부분합 구현문제?
N, S = map(int, input().split())
A = list(map(int, input().split()))

# N: 길이 S: 범위
# sol
# S보다 작으면 계속 더해간다. 그러다가 S보다 커지게 되면 그 이전값부터 다시 시작한다.

hap,left,right,cnt=A[0],0,0,1
result=float('inf')

# 왼쪽에서부터 갯수만큼 left가 돌면 끝
while left<N:
    # 부분합이 S이상이면
    if hap>=S:
        # 최솟값을 넣어준다
        result=min(result,cnt)
    
    # S보다 더 클 때 혹은 right이 정점에 다다르면 left를 전진
    if hap>=S or right == N-1:
        hap-=A[left]
        left+=1
        cnt-=1
    
    # S보다 작을 때 end를 전진
    else:
        right+=1
        cnt+=1
        hap+=A[right]

if result!=float('inf'):
    print(result)
else:
    print(0)

반응형