본문 바로가기

Language/JAVA

[Java][백준 2470][투 포인터] 두 용액 - 컴도리돌이

728x90
 

2470번: 두 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00

www.acmicpc.net


 

해당 문제는 투 포인터 알고리즘으로 해결하였습니다.

두 용액의 합이 0과 가장 근사한 한 쌍을 찾아야 하는 문제입니다.

입력받은 용액의 배열을 정렬을 시키고

왼쪽 인덱스의 값과 오른쪽 인덱스의 값을 더해서

절댓값이 minValue보다 작으면 출력 값(ans1, ans2)과 minValue를 업데이트합니다.

만약 minValue가 0이면 ans1과 ans2를 출력시키고 return 해줍니다.

왼쪽 인덱스의 값과 오른쪽 인덱스의 값의 합(sum)이 0보다 작으면 

왼쪽 인덱스를 1 증가시키고,

그 반대면 오른쪽 인덱스를 1 감소시킵니다.

 

while문이 종료되면 ans1, ans2를 출력시키고 종료합니다.

 

파이썬 풀이 및 해설

 

[Python][백준 2470][투 포인터] 두 용액 - 컴도리돌이

풀이 과정 해당 문제는 단순한 투 포인터 문제이다. 두 값의 합이 0과 가까운 쌍을 찾으면 끝이다. 1. 주어진 x 배열을 정렬시킨다. 2. 문제에서 수들의 합이 매우 크기 때문에 minV를 매우 큰 값으

comdolidol-i.tistory.com


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    static int N;
    static int [] arr;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        arr = new int[N];
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        for(int i=0; i<N ; i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }
        twoPointer(arr,N);
    }
    public static void twoPointer(int [] arr,int N){
        Arrays.sort(arr);
        int left=0,right= N-1,minValue = Integer.MAX_VALUE;
        int ans1= 0,ans2 = Integer.MAX_VALUE;
        while(left < right){
            int sum = arr[left] + arr[right];

            if(Math.abs(sum) < minValue){
                ans1 = arr[left];
                ans2 = arr[right];
                minValue = Math.abs(sum);
            }
            if(minValue == 0) {
                System.out.printf("%d %d",ans1,ans2);
                return;
            } else if (sum < 0) {
                left += 1;
            }else {
                right -= 1;
            }
        }
        System.out.printf("%d %d",ans1,ans2);
        return;
    }
}