728x90
이분탐색 문제입니다.
두개의 값의 합이 x가 되는 값을 찾아야합니다.
만약 값이 여러개라면 더 두개의 차의 절댓값이 더 큰 값들을 출력합니다.
이분탐색은 한개의 값을 고정으로 두고
(고정 값) + (이분탐색을 통해 찾는 값) 이 x가 될 수 있는지 찾습니다.
두 값의 합이 x보다 작으면 left = mid + 1
두 값의 합이 x보다 크면 right = mid - 1
두 값의 합이 x와 같다면 절댓값을 비교해서 더 클 경우 결과값에 저장합니다.
이분탐색 자체는 어렵지 않은 문제이지만
테스트 케이스가 여러개로 이루어져있다는 점을 제대로 확인하지 못하여 시간이 많이 걸렸습니다.
while ((s = br.readLine()) != null) {
}
입력의 시작 부분에 입력이 null이면 종료하도록 해주었습니다.
그리고 출력하는 값에 "\n"를 넣지 않은 문제도 있었습니다.
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String s;
int x;
int n;
int[] arr;
boolean possible;
int lego1;
int lego2;
while ((s = br.readLine()) != null) {
x = Integer.parseInt(s) * 10000000;
n = Integer.parseInt(br.readLine());
arr = new int[n];
possible = false;
lego1 = 0;
lego2 = 0;
for (int i = 0; i < n; ++i) {
arr[i] = Integer.parseInt(br.readLine());
}
Arrays.sort(arr);
for (int i = 0; i < n; ++i) {
int piece1 = i;
int left = i + 1;
int right = n - 1;
while (left <= right) {
int piece2 = (left + right) / 2;
if (arr[piece1] + arr[piece2] == x) {
if (Math.abs(arr[piece1] - arr[piece2]) >= Math.abs(arr[lego1] - arr[lego2])) {
possible = true;
lego1 = piece1;
lego2 = piece2;
}
break;
} else if (arr[piece1] + arr[piece2] < x) {
left = piece2 + 1;
} else if (arr[piece1] + arr[piece2] > x) {
right = piece2 - 1;
}
}
}
if (possible) {
bw.write("yes " + arr[lego1] + " " + arr[lego2] + "\n");
} else {
bw.write("danger \n");
}
}
bw.close();
}
}
'알고리즘' 카테고리의 다른 글
[Java] 백준 2343번 기타 레슨 (0) | 2023.08.08 |
---|---|
[Java] 백준 1034번 램프 (0) | 2023.08.06 |
[Java] 백준 19539번 사과나무 (0) | 2023.08.04 |
[Java] 백준 5557번 1학년 (0) | 2023.08.03 |
[Java] 백준 3079번 입국심사 (0) | 2023.08.02 |