Rylah's Study & Daily Life

[BOJ/C++] 3273. 두 수의 합 본문

BOJ

[BOJ/C++] 3273. 두 수의 합

Rylah 2022. 4. 3. 15:34

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

 

3273번: 두 수의 합

n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는

www.acmicpc.net

두 수의 합 다국어

한국어   
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 128 MB 17308 6213 4792 36.692%

문제

n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는 (ai, aj)쌍의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 수열의 크기 n이 주어진다. 다음 줄에는 수열에 포함되는 수가 주어진다. 셋째 줄에는 x가 주어진다. (1 ≤ n ≤ 100000, 1 ≤ x ≤ 2000000)

출력

문제의 조건을 만족하는 쌍의 개수를 출력한다.

예제 입력 1 복사

9
5 12 7 10 9 1 2 3 11
13

예제 출력 1 복사

3

출처

Olympiad > Balkan Olympiad in Informatics > Junior Balkan Olympiad in Informatics > JBOI 2008 6번

풀이

투포인터를 이용해보자

정렬 이후 투포인터를 이용해서 cnt를 세는 방식

정렬에 nlogn이 들어가서 시간 복잡도는 O(NlogN)

사용한 투포인터는 O(n)이다. 하지만 정렬이 시간복잡도가 더 들어간다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// BaaarkingDog 실전 알고리즘 학습
// 0x03. Array
// 3273. 두 수의 합
// Write : Rylah
// Date : 2022. 04. 03
 
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
 
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
 
    int n; // 1 <= n <= 100000
    cin >> n;
    
    vector<int> v(n);
    for (int i = 0; i < v.size(); i++)
        cin >> v[i];
 
    sort(v.begin(), v.end());
 
    int lhsIdx = 0;
    int rhsIdx = n - 1;
 
    int target;
    cin >> target;
 
    int findCnt = 0;
    while (lhsIdx < rhsIdx)
    {
        if (target == (v[lhsIdx] + v[rhsIdx]))
        {
            findCnt++;
            lhsIdx++;
            rhsIdx--;
            continue;
        }
        else if (target > v[lhsIdx] + v[rhsIdx])
        {
            lhsIdx++;
            continue;
        }
        else if (target < v[lhsIdx] + v[rhsIdx])
        {
            rhsIdx--;
            continue;
        }
 
 
    }
 
    cout << findCnt << "\n";
 
 
    return 0;
}
 
cs

 

 

'BOJ' 카테고리의 다른 글

[BOJ/C++] 13300. 방 배정  (0) 2022.04.03
[BOJ/C++] 10807. 개수 세기  (0) 2022.04.03
[BOJ/C++] 1475. 방 번호  (0) 2022.04.03
[BOJ/C++] 10808. 알파벳 개수  (0) 2022.04.03
[BOJ/C++] 2577. 숫자의 개수  (0) 2022.04.03