[백준] 10816 숫자카드2

leejihun·2022년 5월 24일
0

알고리즘

목록 보기
5/50

https://www.acmicpc.net/problem/10816

#include<iostream>
#include<set>
#include<vector>
#include<string>
#include<algorithm>
#include<map>
using namespace std;


int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	map<int, int> m1;
	int N = 0, M = 0;
	int Num;
	cin >> N;
	vector<int> Result;
	vector<int> v1;
	//vector<int> v2(N);

	for (int i = 0; i < N; i++)
	{
		cin >> Num;

		if (m1.count(Num) == 0)
			m1.emplace(Num, 1);
		else
			m1[Num] ++;
	}

	//sort(v1.begin(), v1.end());


	

	cin >> M;
	for (int i = 0; i < M; i++)
	{
		cin >> Num;

		if (m1.count(Num) == 0)
			Result.push_back(0);
		else
			Result.push_back(m1[Num]);
		
	}

	for (int i = 0; i < M; i++)
	{
		cout << Result[i] << " ";
	}



}

map을 사용하고 숫자를 key 값으로 숫자의 개수를 value로 지정하여 문제를 해결하였다.

( map.count() --> key 값이있으면 개수 반환 없으면 0 반환)

다른 풀이를 보니 C++의 upper_bound와 lower_bound를 이용하여 풀었다.

uppoer_bound는 이분탐색으로 해당 숫자가 끝나는 위치를 반환하고
lower_bound는 이분탐색으로 해당 숫자가 시작되는 위치를 반환하게 된다 .
따라서
upper_bound의 위치와 lower_bound의 위치를 빼주면 해당 숫자의 개수를 알 수 있다
(sort로 정렬이 필수일듯)

    cin >> n;
    int count[n]={0,};
    for(auto i = 0;i<n;i++) {
        int x;
        cin >> x;
        arr.push_back(x);
    }
    sort(arr.begin(),arr.end());

    cin >> m;
    for(auto i =0; i<m;i++) {
        int x;
        cin >> x;

        cout << upper_bound(arr.begin(),arr.end(),x) - lower_bound(arr.begin(),arr.end(),x)<< " ";

밑에 방식이 더 쉬운듯 하다.

profile
U+221E

0개의 댓글