백준(BOJ) 문제풀이

[백준 : 1253] 좋다 [C/C++] (투 포인터)

박박고은 2024. 4. 11. 20:58

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

 

1253번: 좋다

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

www.acmicpc.net

 

문제에서 잘 확인해야 하는 조건

1. Ai가 너무 크니까 그냥 중첩 반복문으로는 안 될 것이라는 것을 알아야 한다.

2. Ai에 있는 절댓값 -> Ai가 음수일 수도 있으므로, Ai보다 작은 수의 범위 안에서만 투 포인터 알고리즘을 사용하는 것은 안된다.

3. 수의 위치가 다르면 값이 달라도 같은 수이다 -> 다른 수 두 개의 합으로 나타낼 수 있다 때문에 A[i]==A[start]orA[end]와 같다고 생각하면 안된다.

 

나는 2, 3번 때문에 왜 안되지.. 하고 있었다. 항상 문제의 조건을 잘 확인하자.

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int N;
vector<long long> A;
int ans;

int main()
{
    cin >> N;
    for(int i = 0; i<N; i++){
        long long t;
        cin >> t;
        A.push_back(t);
    }

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

    for(int i = 0; i<N; i++){
        int start = 0;
        int end = N-1;
        while(start<end){
            if(start==i){
                start++;
                continue;
            }
            if(end==i){
                end--;
                continue;
            }
            if(A[start]+A[end]==A[i]){
                ans++;
                break;
            }
            if(A[start]+A[end]>A[i]){
                end--;
            }
            else{
                start++;
            }
        }
    }
    cout << ans;
}