본문 바로가기
백준알고리즘

백준 1806 부분합[투 포인터]

by tiit 2020. 4. 20.
반응형

어제 투 포인터 풀어서 혼자 풀자고 몇시간 붙잡고 있었지만 

못품 빡치네 ^^........................................

 

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

 

1806번: 부분합

문제 10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다. 출력 첫째 줄에 구하고자 하는 최소의 길

www.acmicpc.net

package algo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.StringTokenizer;

public class BJ_1806 {

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

StringTokenizer st = new StringTokenizer(br.readLine());
PriorityQueue heap = new PriorityQueue();

int N = Integer.parseInt(st.nextToken());
int S = Integer.parseInt(st.nextToken());
int a[] = new int [N];
int start =0;
int end =0;
int sum =0;

int res = 0;

// int res[] = new int [N]; //결과 배열

st = new StringTokenizer(br.readLine());

for(int i=0; i a[i] = Integer.parseInt(st.nextToken());
// System.out.println(a[i]);
}



while(true) { //start, end 가 끝에 도달하면 멈춤
if(sum>=S) { //sum이 S보다 크면
sum -=a[start++]; //sum에 start값을 증가 시켜서  빼줌
}else if(end == N) {  //굳이 S에 대한 조건을 지정을 안해 준 것은 조건문을 안거치고 내려왔다는 것은 s가 이동을 해도 
break;                    //sum 값이 N을 못넘는 다는 것이기 때문에 그냥 끝내 버린다.
}else { //sum이 S보다 작으면 
sum +=a[end++]; //sum에 end값을 증가 시켜서 더해줌
}

if(sum>=S) {
heap.add(end-start);
}


}

if(heap.size() == 0) {
System.out.println(0);
}else {
System.out.println(heap.peek());
}




}

}

----------------------------------------------------------------------------------------------------

https://blog.naver.com/jyh9023/221784135137

 

투포인터 알고리즘(백준 1644 1806 2230)

1806번 문제이 문제를 처음엔 2230 문제처럼 연속합다 구해놓고 풀려고 했더니 100000*100000이라 시간 초...

blog.naver.com

젤 적은 값 계산하기 싫어서 PriorityQueue 썼는데 이거 써도 되는지 몰겠다 ..

 

while 하고 if 문 하는 것 때메 계속 안돼서 결국 블로그 봤다. ... 

찾아보니 if절의 위치를 절묘하게 하는 것이 핵심이라는데 WHY???? 재수없네,, 

 

나는 if절을 

if(sum < S){

   sum +=a[end++]; // 이렇게 먼저 시작했는데 블로그에는 줄여주는 걸 먼저 한다 

}

 

저 순서가 이해가 안됨 

이해해보기......

반응형

댓글