https://www.acmicpc.net/problem/1806
1806번: 부분합
첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
www.acmicpc.net
연속된 수의 부분합이라 정렬을 쓰지 못해서 누적합으로 풀었다.
문제 풀이
- 먼저 입력받은 수열을 인덱스를 하나 늘려 누적합 해주기.
- 최대 - 최소를 해주면 그 부분의 값이 나오니 최대/최소 인덱스 생성
- 반복문을 돌면서 값이 S(n[1])보다 크면 가능하니 can을 true로 설정, 길이 비교해서 작으면 바꿔주기.
- max가 n[0]+1이 되는 경우가 있어 제한 걸어주고, temp값 갱신
- 답 출력
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Baekjoon.Gold
{
class _1806
{
static void Main(string[] args)
{
int[] n = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
int[] arr = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
int[] sum = new int[n[0] + 1];
//누적합
for(int i = 1; i <= n[0]; i++)
sum[i] = arr[i - 1] + sum[i-1];
int min = 0; //왼쪽
int max = 1; //오른쪽
int temp = sum[1];
int ans = n[0];
bool can = false; //가능한지 아닌지
while(max - min > 0 && max <= n[0])
{
//합이 더 크면 가능하고, 길이 조절
if (temp >= n[1])
{
if (ans > max - min)
ans = max - min;
min++;
can = true;
}
else
max++;
if (max > n[0]) //인덱스 넘어갈수 있어서
temp = sum[max - 1] - sum[min];
else
temp = sum[max] - sum[min];
}
if (can)
Console.WriteLine(ans);
else
Console.WriteLine(0);
}
}
}
'문제 풀이 > C#' 카테고리의 다른 글
[2589] - 보물섬 (0) | 2022.10.12 |
---|---|
[1707] - 이분 그래프 (0) | 2022.10.11 |
[9639] - Omar Loves Candies (0) | 2022.10.07 |
[17298] - 오큰수 (0) | 2022.10.06 |
[9935] - 문자열 폭발 (1) | 2022.10.05 |