문제 풀이 및 개발 공간

[백준] 20366번 같이 눈사람 만들래? (gold 3 본문

백준공부/java

[백준] 20366번 같이 눈사람 만들래? (gold 3

gomduri43 2024. 5. 21. 18:13

import java.io.*;
import java.util.*;

//세용액 비슷한 느낌. 먼저 두개를 택해서 하나의 눈사람 만들기 투포인터로 최대한 근접하게 만들기.

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
        int n=Integer.valueOf(br.readLine());
        StringTokenizer st=new StringTokenizer(br.readLine());

        int[] num=new int[n+1];
        for(int i=1; i<=n; i++){
            num[i]=Integer.valueOf(st.nextToken());
        }

        //투포인터 사용해야하므로 정렬.
        Arrays.sort(num);
        int min=Integer.MAX_VALUE;
        //두개를 택하고 투 포인터로 근접하게.
        for(int i=1; i<=n; i++){
            int saveN1=num[i];
            int temp=0;
            num[i]=-1;
            for(int j=i+1; j<=n; j++){
                temp=saveN1+num[j];
                int saveN2=num[j];
                num[j]=-1;

                int start=1;
                int end=n;
                int sum=0;

                while(start<end){
                    //만약, start, end의 초기값이 -1인 경우에
                    //각 -1 판별이 뒤에 있다면, 이 경우를 무시하지 못함.
                    //따라서 앞에서 판별하는 것이 맞다. 
                    if(num[start]==-1){
                        start++;
                        continue;
                    }
                    else if(num[end]==-1){
                        end--;
                        continue;
                    }

                    sum=num[start]+num[end];
                    int dif=Math.abs(sum-temp);
                    min= min > dif ? dif :min;

                    if(sum==temp){
                        min=0;
                        break;
                    }
                    else if(sum<temp){
                        start++;
                    }
                    else{
                        end--;
                    }
                }
                num[j]=saveN2;
            }
            num[i]=saveN1;
        }
        System.out.println(min);
    }
}