[백준/C++] 4358번: 생태학

-inn·2022년 5월 24일
0

백준

목록 보기
23/28

4358번: 생태학 문제 바로가기

문제


문제 풀이 과정

나무의 종이 한 줄 기준으로 여러 그루가 입력되고,
다 입력 받은 후에 각 나무의 종이 차지하는 비율을 사전순으로 출력 (소수점 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;
}
  1. 나무 입력 받기

    입력 개수가 주어지지 않음 / 한 줄씩 입력 받음

    while(getline(cin, str)) { }

  2. 나무의 종 중복된 경우, value값 증가

  3. 반복문 데이터 접근으로 결과값 출력

    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;
}

참고 사이트
https://life-with-coding.tistory.com/305

profile
☁️

0개의 댓글