코테/백준
99클럽 코테 스터디 5일차 TIL 투포인터(두 용액)
zsunny
2025. 1. 17. 17:25
https://www.acmicpc.net/problem/2470
사용 알고리즘
투 포인터
아이디어
1. 배열 정렬
2. 두 용액의 합이 음수일 때는 s++;, 양수일 때는 e--;로 범위 좁히기
3. 음수일 때, sum의 절댓값이 0에 가까워지는 수로 갱신하고, 양수일 때 sum이 0에 가까워지는 수로 갱신
유의점
1. 절댓값 처리를 잘못해서 디버깅하다가 헷갈림; 주석으로 한번 잘 장리해두고 적자..
제출코드
package BOJ.BinarySearch;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class BOJ_2470_두용액 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] 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[] ans = new int[2];
int res = Integer.MAX_VALUE;
int s = 0;
int e = n - 1;
while(s < e){
int sum = arr[s] + arr[e];
if(sum == 0) {
ans[0] = arr[s];
ans[1] = arr[e];
break;
}
if (sum < 0) {
// |sum|이 이전 res 값보다 작으면 치환 (ex. sum=-6, res=15)
if(Math.abs(sum) < res){
res = Math.abs(sum);
ans[0] = arr[s];
ans[1] = arr[e];
}
s++;
}
else {
// sum이 이전 res 값보다 작으면 치환 (ex. sum=6, res=15)
if(sum < res){
res = Math.abs(sum);
ans[0] = arr[s];
ans[1] = arr[e];
}
e--;
}
}
System.out.println(ans[0] + " " + ans[1]);
}
}