본문 바로가기

알고리즘/BOJ

[C++] 백준 11652번 - 카드


0. 문제

 

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

 

1. 아이디어

 

1) N개의 숫자카드에 적혀 있는 정수들을 arr 배열에 저장하고 sort 함수를 사용해서 정렬한다.

 

2) 오름차순으로 정렬된 arr 배열에서 어떤 정수가 몇 개가 있는지를 카운트해서 pair 쌍으로 저장한다.

ex) 1이라는 값이 3개가 존재한다면 tmp 배열에 <1, 3>으로 저장한다.

 

3) tmp 배열에서 second(개수)가 가장 큰 원소의 first(값)을 출력한다.

 

2. 소스코드

 

#include <iostream>
#include <utility>
#include <algorithm>
long long arr[100000];
std::pair<long long, long long> tmp[100000];
int main()
{
	std::ios_base::sync_with_stdio(0);
	std::cin.tie(0);
	int N;
	std::cin >> N;
	
	for (int i = 0; i < N; i++)
		std::cin >> arr[i];

	std::sort(arr, arr + N);

	long long cnt = 1, idx1 = 0;
	long long st = arr[0];
	for (int i = 1; i < N; i++)
	{
		if (arr[i] == st) cnt++;
		else
		{
			tmp[idx1++] = std::make_pair(st, cnt); // ex) 1이라는 값이 3개가 존재한다면 tmp 배열에 <1,3>으로 저장한다.
			st = arr[i];
			cnt = 1;
		}
	}
	tmp[idx1] = std::make_pair(st, cnt);

	int idx = 0;
	int result = tmp[0].second;
	for (int i = 1; i < 100000; i++)
	{
		if (tmp[i].second > result)
		{
			result = tmp[i].second;
			idx = i;
		}
	}
	std::cout << tmp[idx].first;
}

 

3. 결과

 

 

4. 피드백

 

  • 생각보다 헷갈렸지만 흐음.. 잘한 거 같다!

더보기

(이라고 생각했는데 찾아보니까 <key, value>를 값으로 가지는 map이라는 container가 있었다.. 이걸 사용했으면 훨씬 간단하게 구현이 가능한거 같은데 공부해야겠다!)

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
#include <map>
bool sort_map(std::pair<long long, long long> p1, std::pair<long long, long long> p2)
{
	if (p1.second == p2.second) return p1.first > p2.first;
	return p1.second < p2.second;
}
int main()
{
	int N;
	std::cin >> N;

	std::map<long long, long long> m;
	std::vector<std::pair<long long, long long>> v;

	for (int i = 0; i < N; i++)
	{
		long long input;
		std::cin >> input;
		m[input]++;
	}
	
	std::copy(m.begin(), m.end(), std::back_inserter(v));
	std::sort(v.begin(), v.end(), sort_map);

	std::cout<<v[v.size()-1].first;
}

성공!


 

TO DO LIST: MAP Container