728x90
http://www.acmicpc.net/problem/1806
# 조건
- 10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다.
- 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오.
입력
- 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다.
- 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
출력
- 첫째 줄에 구하고자 하는 최소의 길이를 출력한다.
- 만일 그러한 합을 만드는 것이 불가능하다면 0을 출력하면 된다.
# 접근 방법
- 내림차순으로 정렬하여 풀려했는데 수열이기 때문에 따로 정렬해주면 안된다.
- 따라서, 누적 합 문제이며 두 포인터를 사용하면 된다.
- 합이 기준 값을 넘을 때, 그 길이를 더해주고,
- 크다면 left pointer 이동
- 작다면 right pointer 이동
import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
N, M = map(int, input().split())
nums = [*map(int, input().split())]
l_pointer = 0
r_pointer = 0
result = float('INF')
part_sum = nums[0]
while r_pointer < len(nums):
if part_sum >= M:
result = min(result, r_pointer - l_pointer + 1)
part_sum -= nums[l_pointer]
l_pointer += 1
else:
r_pointer += 1
if r_pointer < len(nums):
part_sum += nums[r_pointer]
print(result if not result == float('INF') else 0)
728x90
'ALGORITHM > 정렬, 탐색,구현' 카테고리의 다른 글
[백준 1208번] 부분 수열의 합 2 (0) | 2023.01.21 |
---|---|
[백준 2467번] 파이썬 - 용액 (0) | 2023.01.19 |
[백준 1005번] 파이썬 - ACM Craft (0) | 2023.01.05 |
[백준 1766번] 파이썬 - 문제집 (1) | 2023.01.03 |
[백준 1484번] 파이썬 - 다이어트 (1) | 2022.12.03 |