문제
https://www.acmicpc.net/problem/4358
풀이
여러 문자열을 입력받아서 오름차순으로 정렬하고, 각 문자열의 백분율을 옆에 출력하면 된다.
오름차순으로 정렬하고, 입력받는 문자열의 개수를 세야 하므로 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 |