on my way
[GDSC Week0-1] 백준 4358번:: 생태학 (C++) 본문
* 문제를 풀기 위해 생각한 아이디어
Map을 사용해서 종의 이름과, 횟수를 넣는 것으로 이해했다.
(또한 C++에서 Map은 자동으로 오름차순으로 정렬되고 중복이 안된다는 점)
main에서는 입력을 받는 부분 -> 반복문으로 찾기로 진행
* 코드
#include <iostream>
#include <iterator>
#include <string>
#include <map>
using namespace std;
int main(int argc, char const *argv[]){
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
map<string, double> dict;
string s;
int cnt=0; //전체 입력횟수
// 입력받는 부분
while (getline(cin, s)) {
dict[s]++; //종별 입력횟수
cnt++; //입력횟수
}
// 출력하는 부분
map<string, double>::iterator iter;
cout<<fixed; //소수점 아래 숫자 출력범위 설정
cout.precision(4); //아래 4자리 수까지 출력
for(iter=dict.begin(); iter!=dict.end(); ++iter){
cout << iter->first << ' ' << (iter->second)*100/cnt << '\n';
}
}
* 어떻게 풀었는지
main 코드를 1. 입력받는 부분 / 2. 횟수를 출력하는 부분으로 나누어서 풀었다.
입력 파트에서는 getline, cin으로 입력을 받고, 중복이면 횟수에서 +1, 그리고 입력받을 때 마다 cnt++
2에서는 차례대로 map을 출력한다.
종(string)값과 해당 (종 별 횟수/cnt한 값)의 소수점 넷째자리까지 출력한다.
* 회고
1. 종료 조건이 없어서 처음에는 while문을 무한으로 돌리고 cin.eof로 getline을 했는데
공백이 map에 입력되는 문제가 발생해서 while문 조건에 getline을 넣으니 해결되었다.
2. 소숫점 아래 자리를 고정하려면 cout<<fixed;를 해야하는 것. precision은 전체 출력 자릿수이다.
3. cin.getline(string, 30)으로 받으니 컴파일 에러가 떴는데 이유를 찾지 못했다.
4. iterator로 순회하는 부분이 손에 익지 않아 다른 코드를 참고했다. (연습해야겠다.)
* 문제 링크
https://www.acmicpc.net/problem/4358
4358번: 생태학
프로그램은 여러 줄로 이루어져 있으며, 한 줄에 하나의 나무 종 이름이 주어진다. 어떤 종 이름도 30글자를 넘지 않으며, 입력에는 최대 10,000개의 종이 주어지고 최대 1,000,000그루의 나무가 주어
www.acmicpc.net
'algorithm > C++' 카테고리의 다른 글
[GDSC Week1-3] 백준 11582번:: 치킨 TOP N (C++) (0) | 2021.10.03 |
---|---|
[GDSC Week1-2] 백준 10610번:: 30 (C++) (0) | 2021.10.03 |
[GDSC Week1-1] 백준 11931번:: 수정렬하기4 (C++) (0) | 2021.10.03 |
[GDSC Week0-3] 백준 1547번:: 공 (C++) (0) | 2021.09.26 |
[GDSC Week0-2] 백준 10804번:: 카드역배치 (C++) (0) | 2021.09.26 |