백준 1806 부분합
https://www.acmicpc.net/problem/1806
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N; //수의 개수
static long S; //합
static long[] arr;
static int INF = 100000001;
public static void main(String[] args)throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
S = Long.parseLong(st.nextToken());
arr = new long[N+1];
//입력받음
st = new StringTokenizer(br.readLine());
for(int i=1; i<=N; i++){
arr[i] = Integer.parseInt(st.nextToken());
}
long minLen = INF;
int tempSum = 0;
int left=1;
int right=0;
while(true){
/**
* [종결]
* right가 끝에 닿았는데 S못넘음
* left가 끝에 닿음
*/
if(right==N && tempSum<=S) break;
if(left==N) break;
if(tempSum<=S) tempSum += arr[++right]; //S보다 작거나 같으면 rightIdx이동(길이늘림)
else{
if(right==left) tempSum += arr[++right]; //S보다 크지만, left가 바싹 따라와서 도망
else tempSum -= arr[left++]; //S보다 큰 일반적인 경우 left이동(길이줄어듬)
}
if(S <= tempSum){
// System.out.printf("요시 %d~%d = %d\n", left, right, right-left+1);
minLen = Math.min(minLen, right-left+1);
}
}
//출력
if(minLen==INF) System.out.println(0);
else System.out.println(minLen);
}
}
예전에 푼 풀이
import java.util.*;
import java.io.*;
public class Main {
static int[] arr;
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
arr = new int[N+1];
st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
System.out.println(findLength(N, M));
}
private static int findLength(int N, int M) {
int low=0;
int high=0;
int length = 0;
long sum=0;
while(low<=high && high <= N) {
if(sum < M) { //앞을 늘린다
sum += arr[high++];
}else if(M <= sum) { //뒤를 줄인다
if(length==0 || high-low < length) length = high-low;
sum -= arr[low++];
}
}
return length;
}
}
아이디어는 같은데 코딩방식만 약간 다름
'알고리즘 > 문제풀이' 카테고리의 다른 글
직사각형 만들기 (0) | 2019.03.15 |
---|---|
[힙] 더 맵게 (0) | 2019.03.11 |
[인덱스트리] 구간 합 구하기 (0) | 2019.03.06 |
[Union&Find] 네트워크연결 (0) | 2019.02.27 |
[그래프] LCA1 (0) | 2019.02.26 |