일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- SWEA
- gorilla/mux
- BOJ
- 16985
- mongodb
- mst
- 시뮬레이션
- 구간합
- 21921
- 크루스칼
- NCP
- 정렬
- 다익스트라
- 백준
- 11659
- 누적합
- 이분 탐색
- 구현
- 17503
- dfs
- 최소신장트리
- DP
- Naver Cloud
- 맥주 축제
- redis
- 점수 따먹기
- c++
- 세그먼트 트리
- golang
- 민준이와 마산 그리고 건우
- Today
- Total
Gi-Log
백준(BOJ) 4358 생태학 C++ 풀이 본문
문제 링크: https://www.acmicpc.net/problem/4358
문제 풀이에 이용된 자료구조: 맵
이 문제에서 중요한 부분은 세 가지로 생각된다.
1. 입력받는 나무의 수가 제시되어 있지 않은데 어느 시점에서 어떻게 입력 받는 것을 중단할 지....
string 자료형 wood 값을 입력 받기 위해서 getline(cin, wood) 함수를 이용하는데 백준에서는 입력이 파일로 들어오므로, 해당 함수가 EOF를 읽게 되면 입력이 종료된다. <-- 아는 사람에게는 정말 당연한 이야기이지만 EOF 개념이나, 테스트 케이스를 파일로 입력 해보지 않은 사람은 굉장히 생소한 개념일 것!
2. 어떤 데이터들의 등장 횟수를 체크하기에 가장 먼저 떠오르는 것은 배열일텐데, 배열에 접근하기 위해서는 인덱스가 필요하다. 그런데 나무 이름을 어떻게 인덱스화 하지....?
나무 이름을 인덱스화 하는 함수도 많을 것이다. 본인 만의 해쉬 함수를 만드는 방법을 생각할 수도 있고(이 정도 아이디어를 떠올리면 고수이지 않을까 싶다...), 단순하게는 파이썬의 딕셔너리가 너무나 그리울 것이다.
두 아이디어 모두 정답이다. C++에서는 map이라는 라이브러리를 include하여 해쉬맵을 이용할 수 있다.
다루는 메소드의 차이는 당연히 존재하지만, 단순하게는 파이썬의 딕셔너리와 동일하다고 생각해도 무방할 것이다.
3. 소수점 넷째자리까지만 표현하는 방법
어떤 수를 10000으로 나누어주고 round 함수 처리한 후에 다시 10000을 곱해주는 방법도 있겠지만 이 경우, 예를 들어 1.3450이라는 결과를 출력하면 1.345로 출력되어 버린다.
이 또한 한 번 알아두면 간단히 해결할 수 있는 문제이다. cout << fixed 와 cout.precision(n)을 이용하면 된다.
코드와 주석을 보는 것이 이해하기에 훨씬 직관적일 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
/* BOJ 4358 생태학 */
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>
#include <string.h>
#include <map>
#define endl '\n'
using namespace std;
typedef long long ll;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
//freopen("input.txt", "r", stdin);
map<string, int> m;
string wood; // 나무 이름 입력받기 위한 문자열
int cnt = 0; // 총 나무 그루 수
while (getline(cin, wood))
m[wood]++, cnt++; // 해당 나무 그루 수 1 증가, 전체 나무 수 1 증가
cout << fixed;
cout.precision(4); // 소수점아래 넷째자리까지만 표현하도록 고정
for (auto i = m.begin(); i != m.end(); i++) // 맵 내 전체 원소 출력
cout << i->first << ' ' << i->second * 100 / (double)cnt << endl;
return 0;
}
|
cs |