반응형
https://www.acmicpc.net/problem/2467
[풀이과정]
투포인터로 풀었다.
0과 가까운 값을 갱신하는 것과 포인터 위치를 변경하는 것의 조건을 각기 다르게 둬야 했는데, 한 번에 처리해서 틀렸다.
[코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
/*
산성 용액 특성값 1 ~ 10억
알칼리성 용액 특성값 -10억 ~ -1
두 용액을 혼합하여 0에 가장 가까운 용액 만들기
*/
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int N;
static long[] liquids, result;
static final long INF = 2_000_000_000;
public static void main(String[] args) throws IOException{
init();
choiceTwoLiquids();
/*
[출력]
0에 가장 가까운 용액을 만드는 두 용액의 특성값을 오름차순으로 출력
*/
System.out.println(result[0] + " " + result[1]);
}
static void init() throws IOException {
/*
[입력]
1. 전체 용액의 수 N (2 <= N <= 100,000)
2~N. 용액의 특성값 (모두 다름)
*/
N = Integer.parseInt(br.readLine());
liquids = new long[N];
st = new StringTokenizer(br.readLine());
for(int n = 0; n < N; n++){
liquids[n] = Long.parseLong(st.nextToken());
}
//오름차순 정렬
Arrays.sort(liquids);
result = new long[2];
}
static void choiceTwoLiquids(){
int left = 0;
int right = N - 1;
long closeToZero = INF;
while(left < right){
long liquid1 = liquids[left];
long liquid2 = liquids[right];
long sum = liquid1 + liquid2;
//두 개의 합이 0이면 끝
if(sum == 0){
result[0] = liquid1;
result[1] = liquid2;
return;
}
//합이 0과 더 가까우면
if(closeToZero > Math.abs(sum)){
//값 갱신
closeToZero = Math.abs(sum);
result[0] = liquid1;
result[1] = liquid2;
}
//합이 0보다 크거나 같으면
if(sum >= 0){
right--;
}
//작으면
else{
left++;
}
}
}
}
반응형
'백준 > 투포인터' 카테고리의 다른 글
[백준] 14921 : 용액 합성하기 (JAVA) (1) | 2024.10.12 |
---|---|
[백준] 2230 : 수 고르기 (JAVA) (1) | 2024.10.05 |
[백준] 1806 : 부분합 (0) | 2024.09.03 |