(https://www.acmicpc.net/problem/2470)
반복문으로 용액을 하나씩 지정하면서 0에서 지정된 용액을 뺀값으로 이분탐색을 돌리려고 했다.
예제를 기준으로 설명하자면,
0-(-99) = 99니까 99를 탐색한다는 생각으로??
근데 코드가 안 짜지더라..
- liq라는 배열을 오름차순으로 정렬해준다.
- 0에 가장 가까운 특성값을 만드는 두 용액을 찾아야하니, 이를 확인하기 위한 check 값을 만들었다.
check는 Integer.MAX_VALUE로 초기화해줌.
- 0에 가깝다는 것은 특성값이 -1 과 1은 같게 여겨진다는 것 -> Math.abs
- 0을 탐색한다는 느낌으로 접근.
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] liq = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0;i<N;i++) {
liq[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(liq);
int check = Integer.MAX_VALUE;
int answer1 = 0; // 출력할 때 특성값이 더 작은 용액
int answer2 = 0; // 특성값이 더 큰 용액
int low = 0;
int high = N-1;
while(low<high) {
int sum = liq[low]+liq[high];
if(Math.abs(sum)<check) { //0에 가까우니 절댓값으로 바꿔서 비교
check = Math.abs(sum);
answer1 = liq[low];
answer2 = liq[high];
}
if(sum < 0) {
low++; //음수 값이 크니까 왼쪽 포인터를 옮겨준다
}
else {
high--; //양수 값이 크니까 오른쪽 포인터를 옮겨준다.
}
}
System.out.println(answer1+" "+answer2);
}
}
아래 코드는 while문 안의 조건문에
if(sum<0), else if(sum>0), else(sum==0일경우) 로 나눴고, else문에 break를 줬더니 시간초과가 났다.
생각해보면, sum=0이면 Math.abs(sum<check)를 비교하는 if문이 있으니 굳이 필요하진 않겠다.