화살표 두개에 의미를 부여해서 탐색범위를 압축시키는 방법
key word: 연속 부분 수열, 순서를 지키며 차례대로,곱의 최소, 부분합
1. 1차원배열에 2개의 포인터
1-1 두개의 포인터가 왼쪽에서 시작하여 같은 방향으로 이동
1-2 두개의 포이터가 양 끝에서 서로에게로 향하는 이동
2. 변수 2개를 포인터로 표현
BOJ 1806
import java.util.*;
public class point {
public static int n,s;
public static int[] a;
static void input(){
Scanner sc = new Scanner(System.in);
n=sc.nextInt();
s=sc.nextInt();
a = new int[n + 1];
for(int i=1;i<=n;i++){
a[i]=sc.nextInt();
}
}
static void pro(){
int r=0, sum=0, ans=n+1;
for(int l=1;l<=n;l++){
sum-=a[l-1]; //l-1 제외
while (r+1<=n && sum< s ){ //r을 옮길수 있을때까지 옮기기
r++;
sum+=a[r];
}
if(sum>=s){
ans=Math.min(ans,r-l+1);
}
}
if(ans==n+1){
ans=0;
}
System.out.println(ans);
}
public static void main(String[] args) {
input();
pro();
}
}
boj 2470
import java.util.*;
public class point_2 {
static StringBuilder sb=new StringBuilder();
public static int n;
public static int[] a;
static void input(){
Scanner sc=new Scanner(System.in);
n= sc.nextInt();
a=new int[n+1];
for(int i=1;i<=n;i++){
a[i]= sc.nextInt();
}
}
static void pro(){
Arrays.sort(a,1,n+1); //정렬
int best_sum=Integer.MAX_VALUE;
int v1=0, v2=0, l=1, r=n;
while(l<r){
int sum=a[l]+a[r];
if(Math.abs(sum)<best_sum){
best_sum=Math.abs(sum);
v1=a[l];
v2=a[r];
}
if(sum>0){
r--;
}l++;
}
sb.append(v1).append(' ').append(v2);
System.out.println(sb);
}
public static void main(String[] args) {
input();
pro();
}
}