알고리즘/문제 풀이

백준 4358 - 생태학(C++)

qqlzzb 2022. 7. 3. 23:08

문제

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

 

4358번: 생태학

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

www.acmicpc.net

풀이

여러 문자열을 입력받아서 오름차순으로 정렬하고, 각 문자열의 백분율을 옆에 출력하면 된다.

오름차순으로 정렬하고, 입력받는 문자열의 개수를 세야 하므로 map을 이용해줬다.

 

이 문제에서는 입력받는 문자열의 개수나 입력을 마치는 조건이 없으므로 입력이 없을 때까지 입력을 받아야 하는데, 이때 while(cin>>s) 나 while(getline(cin, s))와 같은 형태를 사용하면 된다. 

단, cin을 사용하면 공백 기준으로 문자가 잘리기 때문에 한 문자열에 공백이 포함될 수 있는 본 문제에서는 적합하지 않다. 따라서 getline을 사용해준다. 참고로, vscode 같은 곳에서 터미널에 입력을 하고 이제 입력이 없음을 알려주려면 ctrl + z를 눌러주면 된다.

 

또 고려할 점은 소수점 4자리까지 출력해야 한다는 것이다. cout을 사용할 때도 cout.precision(소수점 개수)를 사용하면 되지만 백분율을 구하기 위해 계산 값에 100을 곱하게 되면 소수점 앞 정수 부분이 몇 자리냐에 따라 뒤의 소수점의 개수가 달라졌다. (만약 cout.precision(6)를 한다면, 13.7931은 제대로 나오지만 정수 부분이 한 자리인 3.4483의 경우엔 3.44828까지 출력되었다. cout으로도 이 문제를 해결할 수 있을지도 모르겠으나 이것저것 해보다가 그냥 printf를 사용했다..)

printf를 사용해서 %.4f를 해주면 소수점 넷째 자리까지 출력된다.

 

코드

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

int main()
{
    int cnt=0;
    string s;
    map<string,float> m;
    while(getline(cin,s))
    {
        if(m.find(s)!=m.end())
        {
            m[s]++;
        }
        else m.insert({s,1});
        cnt++;
    }

    for(auto iter = m.begin(); iter!=m.end(); iter++)
    {
        cout<<iter->first<<" ";
        printf("%.4f\n",(iter->second/cnt)*100);
    }
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

백준 10819 - 차이를 최대로(C++)  (0) 2022.07.13
백준 5430 - AC(C++)  (0) 2022.07.11
백준 1197 - 최소 스패닝 트리(C++)  (0) 2022.06.29
백준 2776 - 암기왕(C++)  (0) 2022.06.25
백준 8979 - 올림픽(C++)  (0) 2022.06.23