Algorithm/백준 문제풀이

[백준] 14921 용액 합성하기 - Java

너지살 2024. 2. 11. 16:52

 

 

 

문제 출저

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

 

14921번: 용액 합성하기

홍익대 화학연구소는 다양한 용액을 보유하고 있다. 각 용액은 -100,000,000부터 100,000,000사이의 특성 값을 갖는데, 같은 양의 두 용액을 혼합하면, 그 특성값은 두 용액의 특성값의 합이 된다. 당신

www.acmicpc.net

 

 

문제 풀이

-100,000,000 ~ 100,000,000 값을 갖는 용액이 n개 주어집니다.

두 개 용액을 섞어 0에 가장 가까운 값이 무엇인지 구해야 합니다.

 

투 포인터로 문제를 풀었습니다. 

int[] liquors 용액 배열에 입력값을 받습니다.

Arrays.sort() 메소드를 통해 liquors int 배열을 정렬합니다. 

처음과 끝은 두 개의 포인터로 사용합니다. (start, end)

 

int answer 변수를 선언합니다. answer에는 조건에 맞으면 값을 업데이트를 계속 해서 답을 구할 겁니다.

answer의 초기값으로 포인터의 처음 값인 liquors[start] + liquors[end]로 했습니다. 

 

while문을 사용하여 탐색을 시작합니다. while 조건은 start < end 입니다. 

두 개의 포인터를 더해 result를 구합니다.

answer의 절대값, result의 절대값을 비교하여 더 작은 값을 answer에 넣습니다.

result가 양수면 end 포인터를 1 낮춥니다. result가 음수면 start 포인터를 1 높입니다. 

이런 식으로 두 개의 포인터를 탐색하여 정답을 구합니다. 

 

 

소스 코드


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

/*
용액 합성하기
https://www.acmicpc.net/problem/14921

정렬
가장 작은 값, 큰 값을 더해 result를 구한다.
answer의 절대값과 result의 절대값을 비교하여 더 작은 값을 answer로 업데이트 한다.

result가 양수이면 end -1 한다. result가 양수이면 end +1 한다. 


 */

public class Main {

    static int n;

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

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

        Arrays.sort(liquors);

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

        int answer = liquors[end] + liquors[start];

        while(start < end) {

            int result = liquors[end] + liquors[start];

            if(Math.abs(answer) > Math.abs(result)) {
                answer = result;
            }

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

        System.out.println(answer);


    }

}