본문 바로가기
알고리즘

[백준/C++] 3273번 두 수의 합

by heyh0 2021. 11. 29.

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

// 코드

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

int main(void){
    int N, x, cnt = 0;
    cin >> N;
    int num[N];
    
    for(int i = 0; i < N; i++) cin >> num[i];
    // N개의 수 입력
    cin >> x; 
    // 쌍의 합 x 입력

    int res[x+1] = {};
    // 배열 선언 및 초기화

    for(int j = 0; j < N; j++)
    {
        if((x - num[j]) > 0)
        {// outofbounds 처리
            if(res[x - num[j]] == 1) cnt += 1;
            // x에서 num[j]를 뺏을때 결과인 수의 배열이 1이면 cnt +1
            else res[num[j]] = 1;
            // 아니라면 그 배열을 1로 바꾼다.
        }
    }
    cout << cnt;
return 0;
}

// 리뷰

for문에 처음 들어가는 res[num[j]]는 이전에 나온 수가 없기 때문에 무조건 1이 된다.
그 다음부터의 res[x - num[j]]의 배열이 1이라면 cnt에 + 1을 하는것이다.
이전에 나온 수들 중에 현재 수와 더했을때 x라면 쌍을 추가하는것이다.

처음 코드는 런타임에러
outOfbounds가 생겼다.
생각해보니 만약에 num 수열 안에 x보다 큰 수가 들어가 있다면
인덱스가 -가 되기 때문에 오류가 나는 것은 당연했다.
그래서 0보다 클때만 조건문이 돌아가도록 고쳤다.