백준 1806: 부분합

uni.gy·2023년 12월 12일
0

알고리즘

목록 보기
32/61

문제

풀이

투 포인터로 s 이상인 경우 찾고 가장 짧은 길이 갱신
s 이상인 경우 없으면 0으로 출력하기


코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        st=new StringTokenizer(br.readLine());
        int n=Integer.parseInt(st.nextToken());
        int s=Integer.parseInt(st.nextToken());
        int[] nums=new int[n+1];
        st=new StringTokenizer(br.readLine());
        for(int i=1;i<=n;i++)nums[i]=Integer.parseInt(st.nextToken());
        int l=0,r=1;
        long sum=nums[1];
        int cnt=1;
        int ans=Integer.MAX_VALUE;
        boolean suc=false;
        while(l<=r){
            if(r==n+1)break;
            if(sum<s){
                r++;
                if(r!=n+1)sum+=nums[r];
                cnt++;
            }
            //sum>=s
            else{
                if(cnt<ans){
                    ans=cnt;
                    suc=true;
                }
                if(l!=0)cnt--;
                sum-=nums[l++];

            }
        }
        if(suc)System.out.println(ans);
        else System.out.println(0);
    }
}

#투포인터

profile
한결같이

0개의 댓글