문제
https://www.acmicpc.net/problem/1253
1253호: 양호
숫자 N(1 ≤ N ≤ 2,000)의 수는 첫 번째 줄에, N Ai는 두 번째 줄에 i번째 숫자로 표시됩니다. (|Ai| ≤ 1,000,000,000, 여기서 Ai는 정수)
www.acmicpc.net
용해 과정
먼저 Ai 범위를 양수로 취하고 double for문과 문장으로 풀었다. 그러나 Ai는 음의 정수, 0, 양의 정수를 모두 포함하므로 0 + 자체로 true를 반환하며 이는 false입니다.
범위를 인식한 후 배열을 정렬하고 가장 왼쪽 값과 가장 오른쪽 값을 더합니다.
값이 현재 값보다 작으면 더 큰 수를 더해야 하므로 left+1을 지정하고 크면 right-1을 사용하여 가능할 것 같은 값만 빠르게 비교한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int N;
static int() arr;
public static void main(String() args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
if(N<=2){
System.out.println(0);
return;
}
arr = new int(N);
for(int i=0; i<N; i++){
arr(i) = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
int result = 0;
for(int i=0; i<N; i++){
result += canMake(i);
}
System.out.println(result);
}
public static int canMake(int idx){
int l = 0, r = N-1, now = arr(idx);
while(true){
if(l==idx) l++;
else if(r==idx) r--;
if(l >= r) break;
int sum = arr(l) + arr(r);
if(sum == now){
return 1;
}
else if(sum < now){
l++;
}
else{
r--;
}
}
return 0;
}
}
결과
