출처 : https://www.acmicpc.net/problem/1253
풀이 방법
문제의 설명이 모호해서 시간이 들었다.
헷갈린 부분 명확하게 정리
- 같은 수가 입력으로 여러 개 들어올 수 있다.
- 같은 수의 위치가 다르면 좋은 수를 카운팅 할 때 같은 수만큼 추가해 주어야 한다.
- 음수가 들어올 수 있다.
- 0이 들어올 때 주의해야 한다.
Map을 이용해서 두 수의 합이 입력으로 들어온 수인지, 입력으로 해당 수가 몇 개 있는지 확인해서 answer에 더해주었다.
또한 한 번 좋은 수로 선택된 수를 중복으로 더하지 않기 위해 더해진 수의 Map값을 0으로 설정했다.
#include <iostream>
#include <map>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> numbers;
map<int, int> frequency;
int main() {
int n;
cin >> n;
// 입력 처리
numbers.resize(n);
for (int i = 0; i < n; i++) {
cin >> numbers[i];
frequency[numbers[i]]++;
}
// 정렬된 상태로 탐색
sort(numbers.begin(), numbers.end());
int cnt = 0;
// 두 수의 합을 탐색
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
int a = numbers[i], b = numbers[j];
int sum = a + b;
// 합이 범위를 벗어나면 무시
if (sum > 1000000000 || sum < -1000000000) continue;
// 조건에 따라 처리
if (a == 0 && b == 0) {
if (frequency[0] >= 3) {
cnt += frequency[0];
frequency[0] = 0; // 방문 처리
}
} else if (a == 0 || b == 0) {
if (frequency[sum] >= 2) {
cnt += frequency[sum];
frequency[sum] = 0; // 방문 처리
}
} else if (frequency.count(sum) && frequency[sum] >= 1) {
cnt += frequency[sum];
frequency[sum] = 0; // 방문 처리
}
}
}
cout << cnt;
return 0;
}
'Algorithm' 카테고리의 다른 글
[백준] 소문난 칠공주 1941번 (java) 조합 (0) | 2025.01.28 |
---|---|
[백준] 동전 분배 1943번 (java) dp (0) | 2025.01.28 |
[백준] 택배 배송 (c++) 다익스트라 (0) | 2025.01.16 |
[백준] 하늘에서 별똥별이 빗발친다. (C++) (0) | 2025.01.15 |
[백준] 탑 보기 22866번 (c++) 스택을 활용한 증가 수열 만들기 (0) | 2025.01.14 |