문제 출저
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);
}
}