10816번: 숫자 카드 2
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,
www.acmicpc.net
https://onlytrying.tistory.com/50
10815번: 숫자 카드 문제의 업그레이드 버전 문제이다.
이 문제는 존재 유무뿐만이 아니라 존재하는 갯수까지 세야한다.
필자는 간단히 multiset으로 원소의 중복을 허용하고 count() 멤버함수를 사용하여 구현하려했으나 시간초과가 발생하였다.
연관 컨테이너(map,set 등)는 삽입, 삭제 연산 시 상당히 많은 작업이 필요할 수 있기 때문에 전부 다 입력받고 정렬하는 편이 훨씬 더 빠르다는 것을 간과하고 있었다.
따라서 vector에 정수를 저장한 다음 정렬한 후, 정렬된 범위에서 동작하는 알고리즘인 equal_range() 를 사용하여 upper_bound 반복자와 lower_bound 반복자의 차이가 원소의 갯수인 것을 이용해 문제를 해결하였다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(NULL);
vector<int> card;
int N;
cin >> N;
for (int i = 0; i < N; i++)
{
int num;
cin >> num;
card.push_back(num);
}
sort(card.begin(), card.end());
int M;
cin >> M;
for (int i = 0; i < M; i++)
{
int num;
cin >> num;
pair<vector<int>::iterator, vector<int>::iterator> range = equal_range(card.begin(), card.end(), num);
if (range.first != range.second) cout << range.second - range.first << ' ';
else cout << "0 ";
}
return 0;
}
알고리즘 200일 프로젝트 - 44day
'알고리즘 > BOJ' 카테고리의 다른 글
백준 1920번: 수 찾기 (0) | 2020.05.19 |
---|---|
백준 2869번: 달팽이는 올라가고 싶다 (0) | 2020.05.19 |
백준 10815번: 숫자 카드 (0) | 2020.05.19 |
백준 1620번: 나는야 포켓몬 마스터 이다솜 (0) | 2020.05.18 |
백준 6236번: 용돈 관리 (0) | 2020.05.13 |