문제
https://www.acmicpc.net/problem/1253
1253번: 좋다
첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)
www.acmicpc.net
풀이
- 투 포인터 이동 원칙
- A[i] + A[j] > K : j--;
- A[i] + A[j] < K : i++;
- A[i] + A[j] == K : count++; 프로세스 종료
투 포인터 알고리즘
투 포인터 알고리즘 2개의 포인터로 알고리즘의 시간 복잡도를 최적화한다. 투 포인터 알고리즘을 활용하여 2개의 그룹을 병합하는 과정 - 시간 복잡도 : O(N + M) (N, M : 정렬된 배열 A와 B의 데이터
soobin0821.tistory.com
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
vector<int> A(N);
for(int i = 0; i < N; i++)
{
cin >> A[i]; // 배열 A에 데이터 저장
}
sort(A.begin(), A.end()); // 배열 A 정렬하기
int count = 0;
for(int pivot = 0; pivot < N; pivot++)
{
int i = 0;
int j = N - 1;
// 투 포인터 알고리즘
while(i < j)
{
// 서로 다른 두 수의 합인지 체크
if(A[i] + A[j] == A[pivot])
{
if(i == pivot)
{
i++;
}
else if(j == pivot)
{
j--;
}
else
{
count++;
break;
}
}
else if(A[i] + A[j] < A[pivot])
{
i++; // 포인터 i 증가
}
else
{
j--; // 포인터 j 감소
}
}
}
cout << count; // 좋은 수 개수 출력
return 0;
}
오답
배열의 모든 수에 대하여 투 포인터 이동 원칙을 활용해 탐색을 수행한다.
⇒ 자기 자신을 좋은 수 만들기에 포함 X
더보기
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
vector<int> A(N, 0);
for(int i = 0; i < N; i++)
{
cin >> A[i];
}
sort(A.begin(), A.end());
int Result = 0;
for(int k = 0; k < N; k++)
{
long find = A[k];
int i = 0;
int j = N - 1;
// 투 포인터 알고리즘
while(i < j)
{
// 서로 다른 두 수의 합인지 체크
if(A[i] + A[j] == find)
{
if(i != k && j != k)
{
Result++;
break;
}
else if(i == k)
{
i++;
}
else if(j == k)
{
j--;
}
}
else if(A[i] + A[j] < find)
{
i++;
}
else
{
j--;
}
}
}
cout << Result << "\n";
}
728x90
'코딩테스트 > 백준' 카테고리의 다른 글
[백준][C++]2023번 신기한 소수 (0) | 2023.09.20 |
---|---|
[백준][C++]11724번 연결 요소의 개수 (0) | 2023.09.16 |
[백준][C++]11659번 구간 합 구하기 4 (0) | 2023.09.08 |
[백준][C++]1516번 게임 개발 (0) | 2023.07.21 |
[백준][C++]11404번 플로이드 (0) | 2023.07.16 |