나무의 종이 한 줄 기준으로 여러 그루가 입력되고,
다 입력 받은 후에 각 나무의 종이 차지하는 비율을 사전순으로 출력 (소수점 4자리)
➡️ map을 사용하면 쉽게 풀 수 있겠다 !
# map이란 ?
각 노드가 key와 value 쌍으로 이루어진 트리로 중복을 허용 X
map은 first, second가 있는 pair 객체로 저장
(first - key / second - value)
내부 구현은 검색, 삽입, 삭제가 O(log n)인 레드블랙트리로 구성
## 사용법
map<string, int> m;
- 기본 선언 방법
m.insert("tree", 1);
m[tree] = 1;
- 데이터 삽입
- 중복되면 insert 수행되지 않음
m.find(k);
- 원소 k를 가리키는 반복자를 반환합니다.
- 원소 k가 없다면 m.end() 와 같은 반복자를 반환합니다.
반복문 데이터 접근 (first, second)
for (auto iter = m.begin() ; iter != m.end(); iter++) {
cout << iter->first << " " << iter->second << endl;
}
나무 입력 받기
입력 개수가 주어지지 않음 / 한 줄씩 입력 받음
while(getline(cin, str)) { }
나무의 종 중복된 경우, value값 증가
반복문 데이터 접근으로 결과값 출력
cout << fixed;
cout.precision(4);
#include <iostream>
#include <map>
using namespace std;
string str;
double total;
map<string, double> trees;
int main() {
while(getline(cin,str)) {
total++;
if (trees.find(str) != trees.end()) { // 중복된 경우
trees[str] += 1;
} else {
trees[str] = 1;
}
}
for (auto it = trees.begin(); it != trees.end(); it++) {
cout << it->first << " ";
cout << fixed;
cout.precision(4);
cout << (it->second/total) * 100 << "\n";
}
return 0;
}