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보다 클때만 조건문이 돌아가도록 고쳤다.
'알고리즘' 카테고리의 다른 글
[백준/C++] 1436 영화감독 숌 (0) | 2022.06.23 |
---|---|
[백준/C++] 1874번 스택 수열 (0) | 2021.12.05 |
[백준/C++] 1259번 팰린드롬수 (0) | 2021.12.04 |
[백준/C++] 5397번 키로거 List (1) | 2021.12.03 |
[백준/C++] 1158번 요세푸스 문제 List iterator 사용 (0) | 2021.12.02 |