Problem Solving

C++) 백준 1253 좋다

소년조 2022. 8. 3. 21:44
 

1253번: 좋다

첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)

www.acmicpc.net


코드

 

#include <algorithm>
#include <iostream>

using namespace std;

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	long long x[2005] = { 0 };
	int n, cnt = 0;

	cin >> n;
	for (int i = 0; i < n; i++) cin >> x[i];

	sort(x, x + n);

	if (n < 3) { cout << cnt; return 0; }
	if (!x[0] && !x[2]) cnt++;

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (i == j) continue;
			int low = lower_bound(x, x + n, x[i] - x[j]) - x;

			if (low == j || low == i)continue;
			if (x[low] + x[j] == x[i]) {
				cnt++; break;
			}
		}
	}
	cout << cnt;
}

 

 

풀이

 

a + b = c 일 경우 c - b = a 임을 이용

 

c : 코드 상의 x[i]

b : 코드 상의 x[j]

a : 코드 상의 x[i] - x[j]

 

1. 이분 탐색을 이용하여 배열 내 값 a의 하한에 해당하는 인덱스를 찾아 변수 low에 삽입

2. low 인덱스 값의 중복 여부 판단 후 a + b = c의 성립 여부 확인

3. 성립 시 카운팅 후 중복 방지를 위해 반복문 탈출