알고리즘/문제풀이

[투포인터] 부분합

lipnus 2019. 3. 8. 22:32
반응형

백준 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