카테고리 없음

[백준] 두 용액 2470 java - 투 포인터

혜유우 2024. 6. 1. 02:14

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

 

 

첫번째 풀이

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));

        int N = Integer.parseInt(br.readLine());
        long[] water = new long[N];

        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i=0;i<N;i++){
            int n = Integer.parseInt(st.nextToken());
            water[i] = n;
        }

        Arrays.sort(water);

        int index = 0;
        for(int i=0;i<N;i++){
            if(water[i]<0&&water[i+1]>=0) {
                index = i;
                break;
            }
        }

        long min = Integer.MAX_VALUE;
        long minVal1 = 0;
        long minVal2 = 0;

        for(int i=0;i<=index;i++){
            long start = water[i];
            for(int j=index+1;j<N;j++){
                long end = water[j];
                min = Math.min(min, Math.abs(start+end));
                if(min==Math.abs(start+end)){
                    minVal1 = start;
                    minVal2 = end;
                }
            }
        }
        System.out.println(minVal1+" "+minVal2);

    }

}

이중 반복문을 사용해서

당연히 시간 초과가 발생할 수 밖에,,,

 

 

두 번째 풀이

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));

        int N = Integer.parseInt(br.readLine());
        long[] water = new long[N];

        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i=0;i<N;i++){
            int n = Integer.parseInt(st.nextToken());
            water[i] = n;
        }

        Arrays.sort(water);

       // -99 -2 -1 4 98

        long min = 2000000000;
        long minVal1 = 0;
        long minVal2 = 0;
        int start = 0;
        int end = N-1;

        while(start<end){
            long sum = water[start]+water[end];
            min = Math.min(min, Math.abs(sum));

            if(min==Math.abs(sum)){
                minVal1 = water[start];
                minVal2 = water[end];
            }

            if(sum>0)
                end--;
            else
                start++;
        }

        System.out.println(minVal1+" "+minVal2);

    }

}

원래는 이분 탐색을 이용해서 풀려고 했지만

최소값, 최대값의 범위를 설정하는게 어려워서

투 포인터를 사용했다 !!