백준 [1253] "좋다"

Kimbab1004·2024년 8월 5일
0

Algorithm

목록 보기
60/102
post-thumbnail

투 포인터를 이용해 해결하는 문제였다. 어떤 알고리즘을 사용할 것인지는 바로 생각해 냈지만 이전에 풀었던 투 포인터 문제의 풀이방식을 생각해 풀이한 탓에 꽤 오래 시간이 걸렸다.

투 포인터는 index 0, index n-1 방식과 index 0, index 1 방식 등 여러 index 방식에서 시작 할 수 있는데 나의 오답 풀이는 후자 방식으로 이는 최소값이 무엇인지 찾을때 적합하다. 지금 처럼 숫자의 조합이나 최대값, s == e가 같아지는 경우등이 존재할 경우 힘들어진다.

정답

#include <iostream>
#include <algorithm>
#include <cstring>
#include <stack>
#include <vector>

using namespace std;
int n;
vector<int> v;

int good = 0;

//두개의 합
//1
//2
//3 2, 1
//4 3, 1
//5 3, 2
//6 4, 2
//7 4, 3
//8 5, 3
//9 5, 4
//10 7, 3

//완전 탐색하면 뻑날거고 투포인터?

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

	cin >> n;

	if (n < 3) {
		cout << 0;
		return 0;
	}

	for (int i = 0; i < n; i++) {
		int a;
		cin >> a;
		v.push_back(a);
	}

	sort(v.begin(), v.end());

	for (int i = 0; i < n; i++) {

		int s = 0;
		int e = n-1;

		while (s < e){
			if (v[s] + v[e] < v[i]) {
				s++;
			}
			else if (v[s] + v[e] > v[i]) {
				e--;
			}
			else {
				if (s == i) s++;
				else if (e == i) e--;
				else if(v[s] + v[e] == v[i]) {
					good++;
					break;
				}
			}
		}
	}
	
	cout << good;

	return 0;
}

0개의 댓글