이우의 개발일지
[백준/C++] 1181번 단어 정렬 - sort (1) 본문
백준 1181번 단어 정렬
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 | 256 MB | 187690 | 78845 | 59128 | 40.410% |
문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.
입력
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
출력
조건에 따라 정렬하여 단어들을 출력한다.
https://www.acmicpc.net/problem/1181
정렬 조건이 2개 였다.
1번째는 글자 갯수가 짧은 순으로
2번째는 글자 갯수가 같다면, 알파벳 순으로
sort의 사용자 정의 함수를 이용해서 간단히 풀 수 있긴했다.. (3중 반복문 써도 풀리지만, 시간초과가 뜬다...)
sort(vec.begin(), vec.end(), [](const string & a, const string & b) {
if (a.size() != b.size())
return a.size() < b.size();
return a < b;
});
sort에 대해 더 자세히 알고싶다면, 밑에 글 참고하면 된다.
단어정렬 맞은 코드
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
using namespace std;
int main() {
cin.tie(0);
ios::sync_with_stdio(0);
int n;
cin >> n;
//vector<pair<string, int>> vec;
vector<string> vec;
for (int i = 0; i < n; i++) {
string st;
cin >> st;
int flag = 0;
if (i == 0) vec.push_back(st);
for (int j = 0; j < vec.size(); j++) {
if (st == vec[j]) {
flag = 0;
break;
}
else flag = 1;
}
if(flag == 1) vec.push_back(st);
}
int size = vec.size();
sort(vec.begin(), vec.end(), [](const string & a, const string & b) {
if (a.size() != b.size())
return a.size() < b.size();
return a < b;
});
for (int i = 0; i < size; i++) {
cout << vec[i] << '\n';
}
}
단어 정렬 시간 초과 코드
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
using namespace std;
int main() {
cin.tie(0);
ios::sync_with_stdio(0);
int n;
cin >> n;
//vector<pair<string, int>> vec;
vector<string> vec;
for (int i = 0; i < n; i++) {
string st;
cin >> st;
int flag = 0;
if (i == 0) vec.push_back(st);
for (int j = 0; j < vec.size(); j++) {
if (st == vec[j]) {
flag = 0;
break;
}
else flag = 1;
}
if(flag == 1) vec.push_back(st);
}
int size = vec.size();
//cout << vec.size() << '\n';
// 길이가 짧은 것부터
for (int i = 0; i < size-1; i++) {
for (int j = i + 1; j < size; j++) {
if (vec[i].size() > vec[j].size()) {
swap(vec[i], vec[j]);
}
else if (vec[i].size() == vec[j].size()) {
int n = 0;
while (1) {
char ch1, ch2;
ch1 = vec[i][n];
ch2 = vec[j][n];
if (ch1 < ch2) break;
else if (ch1 > ch2) {
//cout << "vec[i] : " << vec[i] << " vec[j] : " << vec[j] << '\n';
swap(vec[i], vec[j]);
break;
}
n++;
}
}
}
}
for (int i = 0; i < size; i++) {
cout << vec[i] << '\n';
//cout << vec.size() << '\n';
}
/*char ch1, ch2;
ch1 = 'm';
ch2 = 'w';
if (ch1 > ch2) cout << 1;
else if (ch1 < ch2) cout << 0;*/
}
반응형
'Coding' 카테고리의 다른 글
[백준/C++] 잃어버린 괄호 풀이 1541번 /그리디/알고리즘/코딩테스트 - (1) (0) | 2024.08.05 |
---|---|
[Anaconda] 콘다 가상환경 생성 및 실행 방법/ window(윈도우)/ cmd (0) | 2024.06.30 |
[프로그래머스/c++] 달리기 경주 코딩 문제 (0) | 2024.05.21 |
[백준/C++] 11650번 좌표 정렬하기 (0) | 2024.05.21 |
[백준/C++] 11723번 집합 - (1) (배열 사이즈, deque 사이즈 변동) (0) | 2024.05.20 |