BaekJoon

[BaekJoon] 2470번 두 용액 (Java) 문제 풀이 [Gold 5]

Tenacity_Dev 2023. 12. 31. 21:07
728x90

문제

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

 

2470번: 두 용액

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

www.acmicpc.net

 

어떻게 풀 것인가?

이 문제를 보자마자 떠올랐던 것은 바로 "투포인터를 이용한 이분탐색 알고리즘" 이었다. 

이분 탐색과 result 배열을 이용하여 계속해서 0과 가까운 것을 비교하면서 찾아간다.

 

이것은 아마 코드를 보는 것이 이해가 더 빠를 것이다.

 

풀면서 놓쳤던점

X

 

이 문제를 통해 얻어갈 것

이분탐색에 대한 응용

 

내 코드 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    static int N;
    static int[] arr;

    public static void main(String[] args) throws IOException {
        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());
        }
        Arrays.sort(arr);
        int[] result = twoPoint();
        System.out.println(result[0] + " " + result[1]);
    }

    private static int[] twoPoint() {
        int[] result = new int[2];
        int start = 0;
        int end = N - 1;
        result[0] = arr[start];
        result[1] = arr[end];
        while (start < end) {
            int middle = arr[start] + arr[end];
            if (middle == 0) {
                result[0] = arr[start];
                result[1] = arr[end];
                break;
            }
            if (Math.abs(result[0] + result[1]) > Math.abs(middle)) {
                result[0] = arr[start];
                result[1] = arr[end];

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

        }
        Arrays.sort(result);
        return result;
    }
}

 

참고

X

728x90