on my way

[GDSC Week0-1] 백준 4358번:: 생태학 (C++) 본문

algorithm/C++

[GDSC Week0-1] 백준 4358번:: 생태학 (C++)

wingbeat 2021. 9. 26. 16:08
반응형

 

 

* 문제를 풀기 위해 생각한 아이디어

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

 

반응형