티스토리 뷰
문제
10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
출력
첫째 줄에 구하고자 하는 최소의 길이를 출력한다. 만일 그러한 합을 만드는 것이 불가능하다면 0을 출력하면 된다.
풀이
투 포인터 알고리즘을 이용하여 풀 수 있다.
-
시작점(start)과 끝점(end)이 첫 번째 원소의 인덱스(0)를 가리키도록 한다.
-
현재 부분 합이 s보다 크거나 같다면, 카운트하고 start를 1 증가시킨다.
-
현재 부분 합이 s보다 작으면, end를 1 증가시킨다.
-
모든 경우를 확인할 때까지 2번부터 3번까지의 과정을 반복한다.
result가 처음 설정한 값인 10000이면 s보다 크거나 같은 합을 만드는 것이 불가능한 것이므로 0을 출력한다.
이외에는 result에 있는 값을 그대로 출력한다.
import sys
input = sys.stdin.readline
n, s = map(int, input().split())
data = list(map(int, input().split()))
result = 100000
interval_sum = 0
end = 0
for start in range(n):
while interval_sum < s and end < n:
interval_sum += data[end]
end += 1
if interval_sum >= s:
result = min(result, end - start)
interval_sum -= data[start]
if result == 100000:
print(0)
else:
print(result)
'PS > BOJ' 카테고리의 다른 글
[Python] [백준] 2211번: 네트워크 복구 (0) | 2021.03.10 |
---|---|
[Python] [백준] 10159번: 저울 (0) | 2021.03.08 |
[Python] [백준] 1644번: 소수의 연속합 (0) | 2021.03.08 |
[Python] [백준] 4948번: 베르트랑 공준 (0) | 2021.03.07 |
[Python] [백준] 4386번: 별자리 만들기 (0) | 2021.03.07 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 최소공통조상
- javascript
- python
- 고차함수
- 플로이드워셜
- Java
- 인프런
- 백준
- SCSS
- 1급객체
- CSS
- 웹팩
- BFS
- webpack
- 자바스크립트
- BOJ
- 알고리즘
- 위상정렬
- 투포인터
- 에라토스테네스의체
- 다익스트라
- MST
- frontend
- js
- 파이썬
- heapq
- controller
- 최소스패닝트리
- springboot
- html
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함