public class boj3151 {
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];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
long answer = 0;
for (int i = 0; i < n; i++) {
if(arr[i] > 0) break;
int str = i + 1;
int en = n - 1;
while(str < en){
int s = 1;
int e = 1;
int c = arr[i] + arr[str] + arr[en];
if (c == 0) {
if (arr[str] == arr[en]) {
answer += comb(en - str + 1);
break;
}
while (str + 1 < en && arr[str] == arr[str + 1]) {
s++;
str++;
}
while (str < en - 1 && arr[en] == arr[en - 1]) {
e++;
en--;
}
answer += s * e;
}
if (c > 0) {
en--;
}else
str++;
}
}
System.out.println(answer);
}
static int comb(int i) {
return i * (i - 1) / 2;
}
}
- 학생들을 오름차순으로 정렬한다.
- 0번째 인덱스를 기준으로 다음 값을 start, 끝 값을 end로 두고 이분 탐색.
- 0번째 인덱스가 0 보다 크면 start + end + 0번째 인덱스가 무조건 0이상이므로 반복문 탈출.
- start + end + 0번째 인덱스를 더한 값이 0이면
- start값과 end값이 같으면 nC2를 사용한다. ex> [-10, 5, 5, 5, 5]
- start+1이 end보다 작으면서 값이 같으면 s++, start++
- end-1이 start보다 크고 값이 같으면 e—, end++
- answer += e * s;를 한다. ex> [-12, 5, 5, 5, 5, 0, 0, 7, 7, 7] ⇒ s = 4, e = 3
- start + end + 0번째 인덱스를 더한 값이 0보다 크거나 작으면 start++, end— 를 진행한다.