https://www.acmicpc.net/problem/10815
10815번: 숫자 카드
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,
www.acmicpc.net
저번 글이었던 7785번과 상당히 유사한 문제다. set을 이용하는 문제이며, set 컨테이너를 이용해야겠다고 마음먹고는 거진 10분만에 풀어버렸다. 문제 난이도 또한 상당히 쉽다. 하지만, 최댓값이 500,000이기에 O(N^2)인 경우 시간초과가 나지않을까 잠깐 걱정했으나, set컨테이너에서 특정 값을 찾는 find 메소드의 시간복잡도는 O(logN)에 불과하기 때문에, 반복문 안에 넣어도 O(NlogN)정도밖에 안나온다. 이 문제의 시간제한이 2초나 되기때문에, 그럴 염려는 없다고 판단한 후 바로 풀어냈다.

#include <iostream>
#include <set>
using namespace std;
int main() {
cin.tie(NULL);
cout.tie(NULL);
ios::sync_with_stdio(false);
int N;
cin >> N;
set<int> s;
for (int i=0; i<N; i++) {
int a;
cin >> a;
s.insert(a);
}
int M;
cin >> M;
set<int>::iterator it;
for (int i=0; i<M; i++) {
int a;
cin >> a;
it = s.find(a);
if (it != s.end()) cout << 1 << ' ';
else cout << 0 << ' ';
}
printf("\n");
return 0;
}
set 컨테이너에서 특정한 값이 있는지 없는지 판별하기
set<int>::iterator it; //iter 선언 it = s.find(a); if (it != s.end()) cout << 1 << ' '; //값이 존재함 else cout << 0 << ' '; //값이 존재하지않음
ㅇset을 순회할 수 있는 iterator를 선언해준 다음, find() 메소드를 이용해 찾으면 된다. 만약 특정 값이 존재한다면 해당 인덱스의 iter값을 반환하고, 존재하지 않는다면 end() 포인터를 반환한다. 이를 이용해 간단히 조건문으로 구현 가능하다.
* find() 메소드의 시간복잡도는 O(logN)에 해당한다. 상당히 빠르게 원하는 값을 찾을 수 있다.
728x90
'Algorithm > BOJ' 카테고리의 다른 글
| [BOJ] #1620 나는야 포켓몬 마스터 이다솜 (0) | 2023.10.30 |
|---|---|
| [BOJ] #10816 숫자카드2 (0) | 2023.10.27 |
| [BOJ] #7785 회사에 있는 사람 (0) | 2023.10.27 |
| [BOJ] #2903 중앙 이동 알고리즘 (0) | 2023.10.26 |
| [BOJ] #18870 좌표 압축 (0) | 2023.10.26 |