์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[๋ฐฑ์ค€(BOJ)] 3273๋ฒˆ: ๋‘ ์ˆ˜์˜ ํ•ฉ (Two Pointers Algorithm, C++)

PROGRAMMING/Algorithm

by koharin 2021. 1. 22. 19:21

๋ณธ๋ฌธ

728x90
๋ฐ˜์‘ํ˜•

 

๐Ÿ’ป C++  ์ œ์ถœ์ฝ”๋“œ


#include <bits/stdc++.h>

using namespace std;

int main()
{
    int N, X; 
    
    int count=0;

    scanf("%d", &N);
    int right=N-1, left=0;
    vector<int> A(N);

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

    scanf("%d", &X);
    
    sort(A.begin(), A.end());

    while(1){
        if(left >= right) break;
        int sum = A[left]+A[right];
        if(sum == X){ 
            count++;
            left++; 
        }
        if(sum >= X) right--;
        if(sum < X) left++;
        
    }
    
    printf("%d", count);

}

 

 

 

 

๐Ÿ“ ๋ฌธ์ œํ’€์ด ๊ณผ์ •


1. ์ •๋ ฌ

  • sort๋กœ ์ •๋ ฌ

 

2. left = 0, right = N-1์—์„œ ํƒ์ƒ‰ ์‹œ์ž‘

  • sum์€ ๋ฐ˜๋ณต๋ฌธ ๋‚ด์—์„œ ์„ ์–ธํ•ด์„œ ์‚ฌ์šฉ -> ๋ฐ–์—์„œ sum์„ ์„ ์–ธํ•˜๊ณ  ๋ฐ˜๋ณต๋ฌธ ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ œ๋Œ€๋กœ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค.

 

3. sum = A[left] + A[right]์ผ ๋•Œ

  • sum == X: count ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ๋‹ค์Œ ํƒ์ƒ‰ ์œ„ํ•ด left++, right--

  • sum > X: ์ˆ˜๊ฐ€ ๋” ์ž‘์•„์ ธ์•ผ ํ•˜๋ฏ€๋กœ right์„ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

  • sum < X: ์ˆ˜๊ฐ€ ๋” ์ปค์ ธ์•ผ ํ•˜๋ฏ€๋กœ left๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

 

4. ๋ฐ˜๋ณต์กฐ๊ฑด

  •  left๋Š” ๊ณ„์† ์ฆ๊ฐ€ํ•˜๊ณ , right์€ ๊ณ„์† ๊ฐ์†Œํ•˜๋ฏ€๋กœ left >= right์ผ ๋•Œ ์ข…๋ฃŒํ•œ๋‹ค.

#include <stdio.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>

using namespace std;

int main()
{
    int N, X; //N: ์–‘์˜ ์ •์ˆ˜ ๊ฐœ์ˆ˜, X: ํƒ€๊ฒŸ ํ•ฉ
    
    unordered_map<int, int> m;

    scanf("%d", &N);
    int right=N-1, left=0;
    vector<int> A(N);

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

    scanf("%d", &X);
    
    sort(A.begin(), A.end());
    
    while(1){
        if(left >= right) break;
        printf("left: %d, right: %d\n", left, right);
        int sum = A[left]+A[right];
        if(sum == X){ 
            printf("(%d, %d)\n", A[left], A[right]);
            m.insert({A[left], A[right]});
            left++; 
        }
        if(sum >= X) right--;
        if(sum < X) left++;
        
    }
    
    for(auto i: m)
        printf("(%d, %d) ", i.first, i.second);
    printf("\n# of X: %d", m.size());

}

  • ๋งˆ์ง€๋ง‰์— A[3], A[5]์ผ ๋•Œ ํƒ€๊ฒŸ ํ•ฉ X๋ณด๋‹ค ์ปค์„œ right์„ ๊ฐ์†Œ์‹œ์ผฐ๋Š”๋ฐ A[3]+A[4]์ผ ๋•Œ๋Š” ๋” ์ž‘์•„์„œ left๋ฅผ ์ฆ๊ฐ€์‹œ์ผฐ์„ ๊ฒƒ์ด๋‹ค.

  • ๋”ฐ๋ผ์„œ ์œ„์˜ ์ผ€์ด์Šค์˜ ๊ฒฝ์šฐ, left == right์ด ๋˜๋ฏ€๋กœ ๋ฐ˜๋ณต๋ฌธ์—์„œ ๋น ์ ธ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

  • ์œ„ ์ฝ”๋“œ๋Š” ์ œ๋Œ€๋กœ ๊ตฌํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ์ด๋‹ค.

 

 

 

๐Ÿ‘ ๊ฒฐ๊ณผ


728x90
๋ฐ˜์‘ํ˜•

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ