https://www.acmicpc.net/problem/3151
3151번: 합이 0
Elly는 예상치 못하게 프로그래밍 대회를 준비하는 학생들을 가르칠 위기에 처했다. 대회는 정확히 3명으로 구성된 팀만 참가가 가능하다. 그러나 그녀가 가르칠 학생들에게는 큰 문제가 있었다.
www.acmicpc.net
합이 0 문제는 이분 탐색으로 해결할 수 있습니다.
N이 최대 10,000이기 때문에 10000C3은 = (10000 * 9999 * 9998) / 3!입니다.
따라서, 3중 for문 이용하여 모든 경우의 수에 대해 합이 0이 되는지 확인하는 경우 시간 초과가 발생할 수 있습니다.
두 수 A, B를 선택한 후 (A + B) * -1이 몇개인 지 찾으면 됩니다.
⚠️ 10000C3이므로 주어진 코딩 실력 Ai가 모두 0인 경우, 경우의 수가 int형의 범위를 벗어날 수 있기 때문에
long long형을 사용해야합니다.
아래는 전체 코드입니다.
// 소요 시간 : 40분
#include <bits/stdc++.h>
using namespace std;
int c[10010];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n; cin >> n;
for(int i = 0; i < n; i++) cin >> c[i];
sort(c, c + n);
long long ans = 0;
for(int i = 0; i < n - 2; i++){
for(int j = i + 1; j < n - 1; j++){ // 두 수를 선택
int s = c[i] + c[j]; // 두 수의 합
int l = lower_bound(c + (j + 1), c + n, s * -1) - c;
int u = upper_bound(c + (j + 1), c + n, s * -1) - c;
ans += u - l; // s * -1의 개수를 더해줌
}
}
cout << ans;
}
'Algorithm > Binary Search' 카테고리의 다른 글
[백준 2230번] 수 고르기 (0) | 2022.05.16 |
---|---|
[백준 2467번] 용액 (C++) (0) | 2022.05.13 |
[백준 18869] 멀티버스 2 (C++) (3) | 2022.05.13 |
[백준 16401번] 과자 나눠주기 (C++) (0) | 2022.05.12 |
[백준 2295번] 세 수의 합 (C++) (0) | 2022.05.12 |