백준 부분합 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)
반응형
'코딩테스트 준비' 카테고리의 다른 글
[백준] 부분 문자열 with python(KMP 알고리즘) (0) | 2021.04.03 |
---|---|
백준 최소신장트리 (크루스칼 알고리즘 with python) (0) | 2021.04.02 |
2021 카카오 블라인드 코딩 테스트 (신규 아이디 추천) with python (0) | 2021.03.16 |
프로그래머스 (방의 개수) with python (0) | 2021.03.15 |
프로그래머스 (가장 먼 노드) with python (0) | 2021.03.12 |