3273번: 두 수의 합
n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는
www.acmicpc.net
1보다 크거나 같고, 1000000보다 작거나 같은 n개의 서로 다른 양의 정수 수열을 받아 자연수 x가 주어졌을 때 두 수의 합이 x가 되는 수열 안의 쌍의 개수를 구하는 문제입니다.
문제를 푼 지가 조금 오래되어서 처음에 구현하였던 코드는 정확히 생각이 잘 나지 않는데, 처음에는 입력을 배열에 저장하고 합을 확인하기 위해 배열을 이중으로 돌며 더한 값이 x가 되는지 확인하고 count를 1씩 증가시키는 방법을 사용하였습니다.
하지만 위와 같이 구현했을 때 이미 카운트된 수인 것을 확인해야 하고, 반복을 이중으로 하여 시간이 오래 걸리기 때문에 배열을 한 번만 돌며 확인하는 방법으로 구현합니다.
O(n)의 시간복잡도로 입력 배열을 한 번만 돌면서 count를 증가시키기 위해 이미 확인했다는 것을 검사하기 위한 배열을 추가로 선언, 검사를 하지 않았던 수라면 tmp배열 값을 1로 변경합니다.
#include<iostream>
using namespace std;
int tmp[1000001];
int arr[100001];
int main(void)
{
ios::sync_with_stdio(0);
cin.tie(0);
int n, x;
int count = 0;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
cin >> x;
for (int i = 0; i < n; i++)
{
if (tmp[x - arr[i]] == 1)
count++;
else
tmp[arr[i]] = 1;
}
cout << count;
return 0;
}
배열에 관한 알고리즘 게시글은 여기에서 확인하실 수 있습니다.
'스터디 > 알고리즘 문제풀이' 카테고리의 다른 글
[C++] 백준 2504번 - 괄호의 값 (1) | 2021.06.23 |
---|---|
[C++] Programmers 2020 카카오 인턴십 - 키패드 누르기 (0) | 2021.06.22 |
[C++] 백준 1182번 - 부분수열의 합 (0) | 2021.06.21 |
[C++] 백준 12851번 - 숨바꼭질 2 (0) | 2021.06.02 |
[C++] 백준 1475번 - 방 번호 (0) | 2021.02.20 |