알고리즘-two pointers

이호영·2022년 1월 26일
0

알고리즘

목록 보기
3/4

화살표 두개에 의미를 부여해서 탐색범위를 압축시키는 방법
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();
    }
}

0개의 댓글