문제 링크입니다: https://www.acmicpc.net/problem/1253
1253번: 좋다
첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)
www.acmicpc.net
해쉬 맵 설계를 잘해야하는 문제였습니다.
좋은 숫자의 정의는 "해당 숫자를 제외한 다른 두 숫자의 합으로 해당 숫자를 표현할 수 있는 숫자" 이므로
해당 숫자의 좋은 숫자 여부와, 인덱스를 저장해야 합니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <vector> | |
#include <map> | |
using namespace std; | |
int main(void) | |
{ | |
ios_base::sync_with_stdio(0); | |
cin.tie(0); | |
int N; | |
cin >> N; | |
map<int, pair<bool, int>> visited; // {숫자, {좋은 수 여부, 현재 숫자 인덱스}} | |
vector<int> v(N); | |
for (int i = 0; i < N; i++) | |
{ | |
cin >> v[i]; | |
visited[v[i]] = { false, i }; | |
} | |
for (int i = 0; i < N; i++) | |
{ | |
for (int j = i + 1; j < N; j++) | |
{ | |
int sum = v[i] + v[j]; | |
if (visited.count(sum)) | |
{ | |
// 반드시 다른 숫자의 합 | |
if (visited[sum].second == i || visited[sum].second == j) | |
{ | |
continue; | |
} | |
visited[sum].first = true; | |
} | |
} | |
} | |
int result = 0; | |
for (int i = 0; i < N; i++) | |
{ | |
if (visited[v[i]].first == true) | |
{ | |
result++; | |
} | |
} | |
cout << result << "\n"; | |
return 0; | |
} |


개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
반응형
'알고리즘 > BOJ' 카테고리의 다른 글
백준 1145번 적어도 대부분의 배수 (0) | 2019.10.21 |
---|---|
백준 2501번 약수 구하기 (0) | 2019.10.21 |
백준 2467번 용액 (0) | 2019.10.21 |
백준 7785번 회사에 있는 사람 (0) | 2019.10.21 |
백준 6087번 레이저 통신 (0) | 2019.10.13 |