코딩테스트/백준

[백준 - 1806] 부분합 .java

머밍 2025. 5. 20. 22:57

https://www.acmicpc.net/problem/1806

 

  • 두 포인터 같은 방향으로 이동=> i 고정해놓고 r 이동 
  • 현재 합이 s보다 작고 r이 n-1보다 작은 범위에 속할때 => r을 하나 이동
  • 우측 포인터가 증가하여 curSum이 s 이상이 되면, 그 구간의 길이를 계산하여 count에 저장
  • 그 구간의 최소 구간 길이 갱신

if (answer > n) answer = 0; 

부분합이 s 이상인 연속된 구간이 없을 경우, 결과로 0을 출력

 

이 문제는 정렬을 하면 안되기에 for문으로 왼쪽포인트를 하나씩 증가해가면서 오른쪽 포인터을 통해 해당 조건에 부합하는 값들을 구하면 된다

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.*;


public class test1 {

    public static void main(String[] args)  {
        Scanner sc = new Scanner(System.in);
        int n=sc.nextInt();
        long s = sc.nextLong();

        int[] nums = new int[n];

        for(int i=0;i<n;i++)
            nums[i]=sc.nextInt();

        int r=0, answer =n+1;
        long curSum = nums[0];//현재 부분합
        int count=1;//부분배열의 길이 -> 0번 숫자 추가함
        for(int i=0;i<n;i++){
        //우측 포인터 r을 오른쪽으로 이동시켜가며 합이 s 이상이 되도록 확장
            while(curSum<s && r<n-1) {
                count++;
                curSum+=nums[++r];//r을 증가시키고 해당 값 추가
            }
            if(curSum>=s){
                count=r-i+1;//현재 구간의 길이
                if(count<answer){
                    answer=count;
                }

            }
            //현재 i가 포함되는건 다해봄 -> 합에서 빼기
            curSum -=nums[i];
        }
        //n보다 큰 답은 없음 -> 0 출력
        if(answer>n) answer = 0;
        System.out.println(answer);
    }

}