※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 4358번 문제인 생태학이다.
문제는 아래 링크를 확인하자.

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

 

4358번: 생태학

프로그램은 여러 줄로 이루어져 있으며, 한 줄에 하나의 나무 종 이름이 주어진다. 어떤 종 이름도 30글자를 넘지 않으며, 입력에는 최대 10,000개의 종이 주어지고 최대 1,000,000그루의 나무가 주어

www.acmicpc.net

각 나무의 개수에서 전체를 나눈 값을 나무별로 계산해 출력해야 하는 문제이다.

 

각 나무별로 새로운 정수 하나씩을 map으로 할당해 문제를 해결하자.

 

map(red black tree)은 각 키(key)값을 정렬된 순서로 보관하므로, map의 키를 순서대로 접근하는 것으로 나무 이름을 정렬된 순서대로 접근할 수 있다.

 

아래는 제출한 소스코드이다.

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

map<string, int> mp;
int cnt[10000];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cout << fixed;
	cout.precision(4);

	int total = 0;
	int idx = 0;
	string s;
	while (getline(cin, s)) {
		if (mp.count(s) == 0) mp.insert(make_pair(s, idx++));
		cnt[mp[s]]++, total++;
	}

	for (auto p : mp) {
		cout << p.first << ' ' << (100 * (double)cnt[p.second] / total) << '\n';
	}
}
728x90

+ Recent posts