[[[문제]]] 파일에 사용된 단어와 그 횟수를 출력하라.
대문자는 소문자로 바꿔 계산할 것
[[[원리 분석]]]
만약 단어가 아니라 알파벳을 출력하라고 했다면
[[무식한 방법]]
1. array<int, 26> alpha 컨테이너 객체를 하나 만든다.
2. char 타입의 변수 c 하나를 만든다.
3. while문을 돌리면서 파일에 글자를 c에 읽어온다.
4. c가 알파벳인지를 먼저 체크하고, 대문자면 소문자로 변환한다.
5. alpha의 인덱스를 a ~ z라고 생각한다. 그리고 해당하는 알파벳을 올바른 인덱스 위치에 추가한다(횟수 추가)
6. a ~ z까지 횟수를 출력하여 올바르게 저장되어 있는지 확인한다.
==헤더 파일==
#include <iostream>
#include <fstream>
#include <array>
==소스 코드==
[[map을 이용한 방법]]
논리는 위와 동일하다.
map에서 연관 배열을 사용할 수 있음을 활용한다.
alpha[c] = value, alpha[c]++ 이런식으로 배열의 인덱스를 문자로 넣어 사용할 수 있다.
==헤더 파일==
#include <iostream>
#include <fstream>
#include <map>
==소스 코드==
그런데 문제에서 요구한 사항은 "단어와 횟를" 얻는 것이다.
[[map을 이용하여 단어 혹은 문자열을 인덱스로 사용하기. 연관 배열]]
1. 첫번 쨰 방법처럼 array로 사용한다면, 편법으로 인덱스를 char로 사용할 수는 있었지만 단어 혹은 문자열을 index로 사용할 수 없다. 핵심 방법은 연관 배열을 사용하는 것이다.
word[단어]++ 이렇게 히면 단어 인덱스에 횟수가 추가된다. map은 중복되지 않은 key를 소유하니 가능한 방법이다.
2. 이번엔 출력 방법을 다르게 해보겠다. 이 방식을 구조화 머라고 했는데... structure 머라고...
binding struct였던 것 같다. 구조화 바인딩
=> word에는 pair<string, int>객체가 들어있고 string은 first, int는 second로 값을 뽑아낼 수 있다.
재밌게도 for(const auto& [단어, 횟수] : word) 이런식으로 코드를 짜면 단어라는 변수에 string값이 들어가고 횟수라는 변수에 int값이 저장이 된다.
==헤더 파일==
#include <iostream>
#include <fstream>
#include <map>
==소스 코드==
map이라서 key값 오름차순이 default다. 그래서 단어 A로 시작되는 것이 먼저 출력되는 것이다.
실제로는 아래와 같이 사용되는 것이다
따라서 내림차순으로 만들수도 있다.
[[이번엔 multimap에 넣어보자]
1. map 대신에 multimap container를 만든다.
2. multimap은 중복된 키값을 갖는다. 따라서 연관배열을 사용할 수 없다. 어느 키에 값을 넣어줘야 하는지 모호하기 때문이다.
3. insert(make_pair(first, second)) 방식을 이용하여 pair쌍을 넣는다.
4. 헤더파일에 multimap은 없다. map에 포함된다.
==헤더 파일==
#include <iostream>
#include <fstream>
#include <map>
==소스 코드==
불가능
횟수를 추가할 방법이 없다.
이럴거면 왜 multimap을 사용하나 이상한 코드지만
multimap은 연관 배열이 안된다는 사실을 알기 위한 실습이다.
multimap도 자동 정렬된다. 추가로 횟수로 정렬되도록 해보자.
map 종류 같은 경우 key값으로 자동 정렬이 된다는 사실을 알고 있다.
sort 전역함수도 못쓰고 멤버 함수로도 정렬 관련된 것들이 없다.
key:단어 value:횟수로 저장된 map을 횟수로 정렬하고 싶다면
또 다른 컨테이너B를 key: 횟수, value: 단어 한쌍이 pair가 되게 만들어서 A의 단어와 횟수를 B의 단어와 횟수에 저장해주면된다. 만약 컨테이너 B를 map으로 만들었다면 key값인 횟수로 자동 정렬 될거고 vector에 pair를 넣었다면 내가 정렬을 해줘야 한다.
횟수가 내림차순이 되도록 만들어 보겠다. 아래의 결과에서 횟수를 관찰해 보자. 내림차순으로 되어있다.
학습 장소: 한국공학대학교 게임공학과 수업
참고: https://en.cppreference.com/w/
'---C++ 역량 강화--- > STL 공부' 카테고리의 다른 글
high_resolution_clock (0) | 2024.05.29 |
---|---|
vector(+flat set), set, unordered set 찾기 속도 비교 (0) | 2024.05.28 |
unordered_associative container 학습 (0) | 2024.05.28 |
uniform, normal 분포 (0) | 2024.05.27 |
view adaptor (0) | 2024.05.27 |