Jun's Development Journey

[BOJ] 2470번 두 용액 본문

BOJ/Two Pointer

[BOJ] 2470번 두 용액

J_Jayce 2021. 4. 21. 16:21

문제

www.acmicpc.net/problem/2470

 

2470번: 두 용액

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

www.acmicpc.net

풀이

- 풀이 중점 -

1) 정렬부터 한다.

2) front와 rear가 가리키는 값의 합의 절대값과 min 값을 비교하고, min 및 left, right 값을 갱신한다.

3) front + rear 값이 양수이면(rear값의 절대값이 더 큰 경우) 값을 줄여야 하니 rear값을 감소, 음수이면(rear 절대값이 더 작은 경우, 즉 둘 다 음수 인 경우) front를 증가시켜준다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.*;
import java.util.StringTokenizer;
import java.util.Map.*;

public class BOJ_2470 {
    static int N;
    static long min = Long.MAX_VALUE;
    static long[] samples;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;
        N = Integer.parseInt(br.readLine());
        samples = new long[N];
        st = new StringTokenizer(br.readLine());
        for(int i=0;i<N;i++)
            samples[i] = Long.parseLong(st.nextToken());

        Arrays.sort(samples);
        int front=0, rear = N-1, left=-1,right=-1;
        while(front<rear){
            long sum = samples[front]+samples[rear];
            if(Math.abs(sum) < min){
                min = Math.abs(sum);
                left = front;
                right = rear;
            }
            if(sum>0)
                rear--;
            else
                front++;

        }
        System.out.println(samples[left]+" "+samples[right]);
        System.out.println(min);
    }
}

 

'BOJ > Two Pointer' 카테고리의 다른 글

[BOJ] 17609 회문  (0) 2021.03.03
[BOJ] 6159 코스튬 파티  (0) 2021.02.23
[BOJ] 2531 회전초밥  (0) 2021.02.22