Algorithm
[백준 4358] 생태학
Mirab
2021. 10. 19. 00:42
문제 풀이
단순하게 완전탐색으로는 문제를 해결할 수 없다.
해당 나무의 종이 몇번 등장하는지 알아야 하기 때문에 해당 나무가 있는지 없는지를 빠르게 파악할 수 있어야 한다.
이걸 풀어서 생각해보면 탐색을 O(logN)에 해결하면 쉽게 풀 수 있다.
O(입력받는 나무의 종 10000 x log1000000) => O(60000)
탐색을 빠르게 할 수 있으면서 해당 종이 몇 개 있는지 알 수 있는 자료구조는 map이 있다.
해당 나무의 종이 없다면 새롭게 1로 할당하면 되고, 이미 있는 종이라면 그 횟수를 늘리는 식으로 카운팅을 해놓고
해당 나무의 종의 개수 / (전체 입력 수) * 100을 하게 되면 해당 나무의 % 비율을 계산할 수 있게 된다.
나무 종의 이름이 공백을 포함한 형태이기 때문에 공백을 포함해서 문자열을 입력받아야 한다.
또한, 입력이 끝났는지를 판별하는 eof 개념도 알고 있어야 한다.
소스 코드
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string tree;
map<string, int> mp;
double cnt = 0;
while(getline(cin, tree))
{
mp[tree]++;
cnt++;
}
cout << fixed;
cout.precision(4);
for(const auto& m : mp)
{
//몇 %를 차지하는지 나타내기 위해서는 x100을 해야한다.
cout << m.first << ' ' << m.second / cnt * 100 << '\n';
}
return 0;
}