문제
https://www.acmicpc.net/problem/2467
2467번: 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -
www.acmicpc.net
정수를 2개 선택하는데, 그 정수 2개의 절댓값이 0에 가장 가까운 수가 되도록 선택한다.
같은 절댓값을 만드는 숫자 쌍이 여러개일 경우 아무거나 출력.
입력
첫째 줄에 전체 용액의 수 N ( N은 2이상 10만 이하)
둘쨋줄에는 각 용액의 특성 값이 공백으로 분리되어 주어짐. (각 용액은 -1,0000,0000,000 이상 1,000,000,000 이하)
용액은 오름차순으로 정렬되어 주어진다.
용액의 특성값은 모두 다르다. 중복된 값 없음.
풀이 방법
정렬되어 주어졌기 때문에 바로 투 포인터 알고리즘을 사용하여 풀었다.
양쪽 끝에서 시작해서 거리를 점점 좁혀 나간다.
양쪽 포인터가 가르키는 값의 합의 절댓값이 더 작으면 min값을 갱신한다.
절댓값의 합이 0이면 종료하고 그 때 포인터들이 가르키는 숫자들을 오름차순으로 출력한다.
포인터들이 가르키는 값이 절댓값이 큰 쪽을 한칸씩 줄여 나간다.
포인터들이 가르키는 숫자들의 절댓값이 작아지는 쪽으로 진행 해야 하기 때문.
Java 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ_2467_용액 {
public static void main(String[] args)throws Exception {
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());
}
int lt = 0,rt=N-1;
int[] res = {arr[lt],arr[rt]};
int min = Integer.MAX_VALUE;
int tmp;
while(lt<rt) {
tmp = Math.abs(arr[lt]+arr[rt]);
if(tmp <min) {
min = tmp;
res[0]=lt;
res[1]=rt;
}
if(tmp == 0) break;
if(Math.abs(arr[lt])>Math.abs(arr[rt])) {
lt++;
}else {
rt--;
}
}
System.out.println(arr[res[0]]+" "+arr[res[1]]);
}
}