N개의 수 중에서 어떤 수가 다른 수 두 개의 합으로 나타낼 수 있다면 그 수를 “좋다(GOOD)”고 한다.
N개의 수가 주어지면 그 중에서 좋은 수의 개수는 몇 개인지 출력하라.
수의 위치가 다르면 값이 같아도 다른 수이다.
첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)
좋은 수의 개수를 첫 번째 줄에 출력한다.
10
1 2 3 4 5 6 7 8 9 10
8
이 문제는 HashMap을 이용해서 풀 수 있었다. 부분부분 깊게 생각해봐야 하는 부분이 있기 때문에 여러 테스트케이스를 실행해봐야 할 것 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.HashSet;
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[] arr = new int[N];
int cnt = 0;
HashMap<Integer, Good> map = new HashMap<>();
String[] input = br.readLine().split(" ");
for(int i=0; i<N; i++) {
arr[i] = Integer.parseInt(input[i]);
if(map.containsKey(arr[i])) {
map.get(arr[i]).idx.add(i);
}
else {
HashSet<Integer> set = new HashSet<>();
set.add(i);
map.put(arr[i], new Good(false, set));
}
}
for(int i=0; i<N-1; i++) {
int a = arr[i];
for(int j=i+1; j<N; j++) {
int b = arr[j];
int sum = a+b;
if(map.containsKey(sum)) {
int flag = 0;
if(map.get(sum).idx.contains(i)) flag++;
if(map.get(sum).idx.contains(j)) flag++;
if(flag==0) map.get(sum).flag=true;
else {
if(map.get(sum).idx.size()>flag) map.get(sum).flag=true;
}
}
}
}
for(Good g : map.values()) {
if(g.flag) cnt+=g.idx.size();
}
System.out.println(cnt);
}
public static class Good {
boolean flag;
HashSet<Integer> idx;
public Good(boolean flag, HashSet<Integer> idx) {
this.flag = flag;
this.idx = idx;
}
}
}