-
[백준 Class 2] 1181번 단어 정렬 C++ 풀이C++/백준 2022. 12. 21. 19:10728x90
https://www.acmicpc.net/problem/1181
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
문제 링크입니다.
이 문제의 난이도는 실버5로 문자열과 정렬을 능숙하게 사용할 줄 아는지 묻는 문제입니다.
중복을 허용하지 않는다라고 생각해서 set 자료구조를 떠올리셨을 수도 있겠지만, 굳이 그럴 필요는 없습니다.
1. 길이가 짧은 것 부터
2. 길이가 같으면 사전 순으로
문제에서 제시된 정렬 조건에 맞게 구현하시면 됩니다.
저 같은 경우는 algorithm 헤더에 있는 sort 함수를 사용했습니다.
마지막 인자로 사용자가 정의한 cmp 함수로 문제에서 제시된 조건을 구현했습니다.
단지 조심해야 될 조건은 중복 제거입니다.
입력받음과 동시에 중복을 제거하는 경우가 아니라, 정렬을 먼저 하고 중복을 제거하실 수도 있는데요
이 때, 중복 제거를 신경써주시지 않으면 (Ex. Linear하게 제거하는 경우) 5개의 단어를 입력받았을 때, a a a a a 의 입력이 들어올 경우, 정확히 하나의 a를 리턴하지 않을 가능성이 매우 큽니다.
따라서 중복 제거를 먼저 하시는 것을 추천드립니다 :)
#include <iostream> #include <vector> #include <algorithm> using namespace std; bool cmp(string x, string y) { if (x.length() == y.length()) return x < y; return x.length() < y.length(); } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int N; cin >> N; vector<string> orig; for (int i = 0; i < N; i++) { string s; cin >> s; if (find(orig.begin(), orig.end(), s) == orig.end()) orig.push_back(s); } sort(orig.begin(), orig.end(), cmp); for (int i = 0; i < orig.size(); i++) { cout << orig[i] << '\n'; } }
728x90'C++ > 백준' 카테고리의 다른 글
[백준 Class 2] 11650 좌표 정렬하기 C++ 풀이 (0) 2023.01.16 [백준 Class 2] 10814 나이순 정렬 C++ 풀이 (0) 2023.01.16 [백준 Class 2] 1018번 체스판 C++ 풀이 (0) 2022.12.21 [백준 Class 2] 2798번 블랙잭 C++ 풀이 (0) 2022.12.20 [백준 Class 2] 10250번 ACM 호텔 C++ 풀이 (0) 2022.12.20