https://www.acmicpc.net/problem/1011
입력은 여러 개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스의 첫째 줄에는 구멍의 너비 x가 주어진다.
다음 줄에는 물리 실험실에 있는 레고 조각의 수 n이 주어진다.
다음 n개의 줄에는 레고 조각의 길이 ℓ이 주어진다.
각 테스트 케이스마다 한 줄에 하나씩, 구멍을 완벽하게 막을 수 있는 두 조각이 없다면 'danger'를 출력한다. 막을 수 있는 경우에는 'yes ℓ1 ℓ2'를 출력한다. (ℓ1 ≤ ℓ2)
정답이 여러 개인 경우에는 |ℓ1 - ℓ2|가 가장 큰 것을 출력한다.
투 포인터
정말 많이 틀렸다.
입력과 출력을 두 번 세 번 주의하자.
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String s = "";
while ((s = in.readLine()) != null) {
// 입력을 우선 받고, null이면 추가 입력이 없는것 -> EOF
}
l1조각을 0에, l2조각을 n-1에서부터 시작하여 값을 조정하며 확인하면 된다.
만약 N이 2보다 작다면, 투 포인터로 탐색할 필요없이 조건에 따라 항상 불가능이다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String s = "";
int[] arr;
StringBuilder sb = new StringBuilder();
while ((s = in.readLine()) != null) {
int x = stoi(s) * 10000000;
int N = stoi(in.readLine());
arr = new int[N];
for (int i = 0; i < N; ++i)
arr[i] = stoi(in.readLine());
Arrays.sort(arr);
// 투 포인터로 탐색
if (N >= 2) {
int l1 = 0;
int l2 = N - 1;
boolean flag = false;
while (l1 < l2) {
int sum = arr[l1] + arr[l2];
if (sum == x) {
sb.append("yes ").append(arr[l1]).append(" ").append(arr[l2]).append("\n");
flag = true;
break;
} else if (sum < x) {
l1++;
} else {
l2--;
}
}
if (!flag)
sb.append("danger\n");
} else
sb.append("danger\n");
}
System.out.println(sb);
}
public static int stoi(String s) {
return Integer.parseInt(s);
}
}