본문 바로가기

알고리즘

Boj 1253 좋다 c++

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

 

 

문제

 

길이가 N인 수열이 주어질 때, 각각의 수가 수열 내의 서로 다른 두수의 합으로 나타내어질 수 있는지 검사해야 한다.

수열의 길이는 최대 2000이다. 

(단, 두 수에는 자기 자신을 포함하지 않는다.)

 

풀이

 

두포인터 알고리즘을 사용하여 모든 수에 대한 검사를 수행한다.

이때, 자기 자신을 포함하지 않도록 주의.

 

 

#include <bits/stdc++.h>
#define int long long
using namespace std;

int arr[2001], N, ans;

int f(int t, int idx) {
    int s = 0, e = N-1, res;

    while(s < e) {
        res = arr[s] + arr[e];
        if(res == t) {
            if(s == idx){
                s++; continue;
            }
            if(e == idx) {
                e--; continue;
            }
            return 1;
        }
        if(res < t) {
            s++;
        }
        if(res > t) {
            e--;
        }
    }
    return 0;
}

int32_t main() {

    cin >> N;

    for(int i = 0; i < N; i++) {
        cin >> arr[i];
    }
    sort(arr, arr+N);

    for(int i = 0; i < N; i++) {
        ans += f(arr[i], i);
    }
    cout << ans << "\n";
}

'알고리즘' 카테고리의 다른 글

Boj 2984 c++  (1) 2026.02.15
Boj 1884 고속도로 c++  (0) 2026.02.15
Boj 13306, 34203 오프라인 쿼리 c++  (1) 2026.01.29
Boj 2169 로봇 조종하기 c++  (0) 2025.12.28
Boj 1336 c++ 수열의 개수 NKD  (0) 2025.12.21