본문 바로가기

백준 문제 풀이

백준 1253번 좋다(C++)

728x90

https://www.acmicpc.net/problem/1253

 

1253번: 좋다

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

www.acmicpc.net

 

 처음 봤을 때는 N이 그렇게까지 크진 않아서 그리디하게 풀이 가능하지 않을까 했는데 "두 개" 의 숫자로 나타낼 수 있음이 핵심이다. 

투포인터로 풀어야하는 문제이다.

1. 먼저 숫자를 정렬한다.

2. lo = 0 hi = n - 1로 설정하고 찾는 수 보다 크면 hi-- 작으면 lo++ 하며 범위를 좁힌다.

3. 예외 케이스는 0 0 1이다.

 

0 0 1 의 경우 그냥 투포인터로 잡아놓으면 3을 내놓는다. 0은 0, 1로 나타낼 수 없고 1은 0 0 으로 잡아낼 수 없다.

때문에 현재 lo hi가 i와 달라야한다. 이것만 주의하면 풀 수 있는 문제이다.

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);

	int n;
	cin >> n;

	vector<int> num;
	for (int i = 0; i < n; i++) {
		int tmp;
		cin >> tmp;
		num.push_back(tmp);
	}
	sort(num.begin(), num.end());
	int answer = 0;
	for (int i = n - 1; i > -1; i--) {
		int hi = n - 1;
		int lo = 0;
		while (lo < hi) {
			if (num[i] == num[hi] + num[lo]) {
				if (hi != i && lo != i) {
					answer++;
					break;
				}		
				else {
					if (hi == i)
						hi--;
					else
						lo++;
				}
			}
			else if (num[i] > num[hi] + num[lo]) lo++;
			else hi--;
		}
	}

	cout << answer << '\n';
}