algorithm/Map, Set

[C++] BOJ 4358 생태학

gartenhh 2021. 7. 16. 16:31

문제

백준 4358번 Hardwood Species https://www.acmicpc.net/problem/4358

 

4358번: 생태학

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

www.acmicpc.net

코드

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

map<string, int>m;

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

	string str;
	float cnt = 0;

	while (getline(cin, str)) {
		cnt++;
		m[str]++;
	}

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

	for (auto iter = m.begin(); iter != m.end(); iter++) {
		double percent = iter->second / cnt;
		cout << iter->first << " " << percent * 100 << '\n';
	}
}

풀이방법

맵에 각 나무 종의 이름을 기준으로 개수를 더해준다. 동시에 총 나무 개체수도 cnt값을 증가시키며 구해준다. 맵에서는 자동으로 알파벳순으로 저장되므로, 맵에 저장된 순서대로 나무 종의 이름과 해당 종의 비율을 출력해준다. 비율을 출력할 때에는 map에 저장된 개체수를 앞서 구해둔 cnt값으로 나눈 뒤, 100으로 곱해줬다.

고민과정

map 자체가 익숙하지 않아서 출력방법은 구글링을 통해 알아냈다.

퍼센트가 아니라 그냥 비율인줄 알고 100을 안곱했었다..문제를 꼼꼼하게 읽자

그리고 도대체 왜 백준에서는 잘 돌아가는 코드가 비주얼 스튜디오에서는 돌아가지 않는 것인가...코드를 다 짜고나서 하도 이상하길래 솔루션을 검색해봤는데, 나랑 비슷한 구조로 푸신 분이 계셨다. 혹시나 싶어 바로 백준으로 채점해봤고, 다행히 그 결과 맞았다고 떴다. 나랑 비슷한 방식으로 푸신 분도 없었다면 엄청 멘붕이 왔을 것 같다 :(

컴퓨터..쉽지 않다...