하루하루 꾸준히, 인생은 되는대로

카테고리 없음

백준 생태학 C++ / C++에서 소수점 자리 고정하기

긤효중 2022. 3. 11. 19:59

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

 

4358번: 생태학

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

www.acmicpc.net


문제

생태학에서 나무의 분포도를 측정하는 것은 중요하다. 그러므로 당신은 미국 전역의 나무들이 주어졌을 때, 각 종이 전체에서 몇 %를 차지하는지 구하는 프로그램을 만들어야 한다.


입력

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


출력

주어진 각 종의 이름을 사전순으로 출력하고, 그 종이 차지하는 비율을 백분율로 소수점 4째자리까지 반올림해 함께 출력한다.


해결방안 -> 나무의 종을 입력받고 해당 맵의 key값에 대응하는 value값 증가시키고 백분율을 구하면 된다.

 

새로 배운점 : std::getline() 과  cout<<fixed로 소수점 자리 고정하기

 

std::getline()

->

istream& getline (istream& is, string& str)

 

std::getline() -> <string>에 정의되어 있고, string형에 문자열을 저장할 떄 사용한다.

std::getline()의 첫번쨰 매개변수에 따라 파일입력을 받을지,표준 입력을 받을지 결정한다.

getline()을 통해 표준입력을 받는 경우 ,엔터의 여부에 따라서 입력받을 문자열을 구분한다.

 

std::getline()의 두번쨰 매개변수에는 문자열을 저장할 string 형 변수명,

std::getline()의 세번째 매개변수에는 입력받을 문자들 중에 어느 문자 전까지 저장을 할건지 결정한다.

 

세번째 매개변수가 default인 경우 '\n'이 지정된다.

 

 

 cout<<fixed

 

cout << precision(n) ->인자로 n을 받고, n자리를 나타낸다.

cout << fixed를 추가하면 소수점 이하의 자릿수만 다룰 수 있게 된다.

 

전체 소스 코드->

#include <iostream>
#include <map>
#include <string>

 

//백준 생태학

 

using namespace std;
 
int main(void){
   
    ios_base :: sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL); //cin,cout 최적화 코드
   
    map<string,int> m;
    map<string,int>::iterator iter;
    string arr;
   
    while(getline(cin,arr)){ 
        m[arr]++;
    }
 
    int sum = 0;
 
    for(iter = m.begin();iter != m.end();iter++){
        sum = sum + iter->second;    
    }
   
        cout << fixed;    
        cout.precision(4);
//cout << fixed 후 cout << precision(n) -> n자리 소수를 나타낸다
 
    for(iter = m.begin();iter != m.end();iter++){
 
        double temp = (double)iter->second/(double)sum * 100;
       
        cout << iter->first << " ";
        cout << temp;
        cout << endl;
    }
}