πŸ• Baaaaaarking/0x03κ°• - λ°°μ—΄

[BOJ][C++] λ°±μ€€ 3273번 : 두 수의 ν•©

선달 2021. 12. 23. 11:01
λ°˜μ‘ν˜•

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

 

문제

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 - μ‹œκ°„ 초과

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n,x,ans=0;
    vector <int> v;
    
    cin >> n;
    for(int i=0, tmp; i<n; i++){
        cin >> tmp;
        v.push_back(tmp);
    }
    cin >> x;
    
    for(int i=0; i<n; i++){
        int tmp = x - v[i];
        for(int i=0; i<n; i++){
            if(tmp == v[i]) {
                ans++;
                break;
            }
        }
    }
    
    cout << ans/2;  //μ€‘λ³΅μ œκ±°
    
    return 0;
}

닡은 맞게 λ‚˜μ˜€λŠ” 것 같은데 벑터λ₯Ό μ΄μ€‘μœΌλ‘œ λŒμ•„μ•Όν•΄μ„œ μ‹œκ°„λ³΅μž‘λ„κ°€ λΆˆμ•ˆλΆˆμ•ˆν•˜κΈ΄ ν–ˆλ‹€...

μ—­μ‹œ.. μ•„μ£Ό ν™”λ €ν•˜κ²Œ μ‹œκ°„μ΄ˆκ³Ό

 

풀이2 - λŸ°νƒ€μž„μ—λŸ¬

μ—νœ΄.. κ·Έλž˜μ„œ forλ¬Έ(μ‹œκ°„λ³΅μž‘λ„ O(n))이 μ•„λ‹Œ κ·Έλƒ₯ λ°”λ‘œ (O(1)) x-μ›μ†Œ λΌλŠ” μˆ«μžκ°€ μžˆλŠ”μ§€ νŒλ‹¨ν•  수 μžˆλ„λ‘ 숫자 μ—¬λΆ€λ₯Ό νŒλ‹¨ν•˜λŠ” bool 배열을 λ§Œλ“€μ–΄μ€¬λ‹€.

μ²˜μŒμ—λŠ” int 둜 ν–ˆλŠ”λ° 자꾸 OutOfBounds κ°€ λ– μ„œ μ •μˆ˜λ°°μ—΄μ€ 1000000 μ΅œλŒ€μΈκ±°λ•Œλ¬ΈμΈκ°€ μ‹Άμ–΄ μ—΄μ‹¬νžˆ λ°”κΎΈκ³  μ‚½μ§ˆν•¨..

#include <iostream>
#include <vector>

using namespace std;

bool a[1000001];

int main() {
    int n,x,ans=0;
    vector <int> v;
    
    cin >> n;
    for(int i=0, tmp; i<n; i++){
        cin >> tmp;
        a[tmp] = true;
        v.push_back(tmp);
    }
    
    cin >> x;
    
    for(int i=0; i<n; i++){
        int tmp = x - v[i];
        if (a[tmp])
            ans++;
    }
    
    cout << ans/2;  //μ€‘λ³΅μ œκ±°
    
    return 0;
}

λ¬΄μˆ˜ν•œ μ‚½μ§ˆμ˜ 흔적

μ•„ 근데 μ•Œκ³ λ³΄λ‹ˆ μ „ν˜€ λ‹€λ₯Έκ³³μ—μ„œ λ¬Έμ œκ°€ μƒκΈ΄κ±°μ˜€λ‹€

 

풀이3 - 성곡

μœ„ μ½”λ“œλŠ” κ·ΈλŒ€λ‘œ μ“°κ³  쀑간에 x-μ›μ†Œ 인 tmp λ₯Ό 배열에 λ„£μ–΄μ„œ μ²˜λ¦¬ν•˜κΈ° μ „ 필터링을 ν–ˆλ‹€

문제λ₯Ό 잘 읽자..

보면 μ›μ†ŒλŠ” 1~1000000 이고

xλŠ” 1~2000000이닀

 

κ·ΈλŸ¬λ‹ˆκΉŒ.. xμ—μ„œ μ›μ†Œλ₯Ό λΉΌλ©΄ 2000000-1 ~ 1-1000000 μ΄λ ‡κ²Œ ν—˜λ‚œν•œ λ²”μœ„κ°€ 생긴닀

μŒμˆ˜λ„ 있고 배열크기 λ„˜μ–΄μ„œλŠ” 애도 μžˆμœΌλ‹ˆ λŸ°νƒ€μž„μ—λŸ¬κ°€ 7ν”„λ‘œλΆ€ν„° λ‚˜λŠ”κ±°μ˜€λ‹€.. μ•„μ£Ό μΌμ •ν•˜κ²Œ..

 

μ²˜μŒμ—λŠ” 음수만 μ˜ˆμ™Έμ²˜λ¦¬ν–ˆλŠ”λ° μ‚½μ§ˆλμ— 1000000μ΄ν•˜μ˜ tmp도 μ²˜λ¦¬ν•΄μ€Œ

#include <iostream>
#include <vector>

using namespace std;

bool a[1000001];

int main() {
    int n,x,ans=0;
    vector <int> v;
    
    cin >> n;
    for(int i=0, tmp; i<n; i++){
        cin >> tmp;
        a[tmp] = true;
        v.push_back(tmp);
    }
    
    cin >> x;
    
    for(int i=0; i<n; i++){
        int tmp = x - v[i];
        if (tmp > 0 && tmp < 1000001 && a[tmp]) //μ—¬κΈ° 쑰건을 λ‘κ°œ μΆ”κ°€ν–ˆλ‹€
            ans++;
    }
    
    cout << ans/2;  //μ€‘λ³΅μ œκ±°
    
    return 0;
}

 

TIL

문제λ₯Ό 잘 읽자 ^^

λ°˜μ‘ν˜•