https://www.acmicpc.net/problem/20920
20920번: 영단어 암기는 괴로워
첫째 줄에는 영어 지문에 나오는 단어의 개수 $N$과 외울 단어의 길이 기준이 되는 $M$이 공백으로 구분되어 주어진다. ($1 \leq N \leq 100\,000$, $1 \leq M \leq 10$) 둘째 줄부터 $N+1$번째 줄까지 외울 단
www.acmicpc.net
알고리즘 보다는 C++의 STL 기능을 이해하고 있어야 풀 수 있는 문제
이 문제에서는 문자열이 등장한 횟수를 기록하고 확인해야 하는데 vector만으로는 시간 내에 해결할 수 없다.
따라서 map 컨테이너를 사용한다.
먼저 단어를 입력받아, 일정 길이 이상의 단어에 대해
해당 단어가 map에 존재하는 지 확인(count != 0)하고,
존재하지 않으면 {키, 값(등장한 횟수)} 순서쌍, 즉 {문자열, 0}을 map에 삽입한다.
만약 이미 존재하면 값에 1을 더한다.
문자열과 등장 횟수 정리를 마쳤으면
문제에서 주어진 정렬 기준을 적용할 vector를 생성해, << vector의 자료형은 순서쌍
map의 원소를 하나씩 복사한다.
sort 함수를 사용해 vector의 원소를 직접 생성한 정렬 기준을 이용해 비교한다.
비교자 compare는 다음과 같다.
bool compare(pair<string, int>& a, pair<string, int>& b)
if (a.second == b.second) { // 1번 우선순위에서 결정 X
if (a.first.length() == b.first.length()) // 2번 우선순위에서 결정 X
return a.first.compare(b.first) < 0 ? true : false; //3번 우선순위로 결정
else
return a.first.length() > b.first.length();
else
return a.second > b.second;
배운 내용 :
1. sort
<algorithm> 헤더 파일 필요
문법 : 정렬 시작 구간, 정렬 종료 구간, (비교자)
비교자 : 정렬할 컨테이너의 요소 2개를 참조 연산자를 포함한 인자로 받아, 설정할 비교 조건에서 뒤의 원소가 더 클 때 true를 반환한다.
2. map
<map> 헤더 파일 필요
키-값 형식으로 값을 저장할 수 있는 컨테이너. 해시테이블이라고도 한다.
3. item : vector
Javascript의 foreach처럼 해당 컨테이너의 원소에 순서대로 모두 접근하는 듯? auto와 연계하여 자료형을 명시하지 않고도 사용할 수 있다.
4. 문자열 compare 메소드
a.compare(b) : a - b와 유사 (a가 크면 양수)
인자로 string 객체도 전달 가능하다.
C++ 문법 강좌를 정독하자
'백준' 카테고리의 다른 글
백준 1904 - 01타일 (0) | 2023.05.04 |
---|---|
백준 10815 - 숫자 카드 (0) | 2023.05.03 |
백준 2447 - 별 찍기 10 (0) | 2023.05.01 |
백준 1010 - 다리 놓기 (0) | 2023.04.30 |
백준 1005 - ACM Craft (0) | 2023.04.30 |