출처 : https://www.acmicpc.net/problem/1181
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1≤N≤20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
고려사항
- stl 들을 사용하여 쉽게 풀 수 있음.
- 문자열의 길이를 키로 map<int, set<string>> m 을 만들고,
- 문자열의 길이를 구해서 이미 m 에 있으면, 해당 set에 문자열을 넣어주고,
없으면 새로운 키와 함게 삽입해준다. - 정렬은 map, set 자료구조의 이점으로 자동으로 진행.
- 본 문제에서 for( auto : ) 을 사용하다가 알게된 사실인데,
보통 벡터나, 맵 등에서 간편하게 사용하려고 auto 를 통해 원소에 접근한다
그러나 auto 에는 값이 복사된 임시 값이 전달되는 것이라, 출력은 상관없으나
접근하여 값을 변경 하는 경우에는 *, & 등을 활용하여 접근해줘야한다.
#include <iostream> #include <map> #include <set> using namespace std; int main() { map<int, set<string>> m; string str; int n, strlen; cin>>n; for(int i=0;i<n;++i){ cin>>str; strlen = str.length(); if(m.find(strlen) != m.end()){ m[strlen].insert(str); }else{ set<string> s; s.insert(str); m[strlen] = s; } } return 0; }