1181 단어 정렬
https://www.acmicpc.net/problem/1181
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1≤N≤20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
여기서는 속도 차이를 보여드리겠습니다. 우선 그전에 두가지 방식을 사용해서 문제 풀이를 하겠습니다
출력할때만 중복없이 출력하는 방법
#include<algorithm>
#include<vector>
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
bool cmp(const string &u, const string &v) {
if (u.size() == v.size())return u < v;
else return u.size() < v.size();
}
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N;// 단어 개수 입력
cin >> N;
vector<string> s(N);//문자열 저장할 백터
for (int i = 0; i < N; i++) {
cin >> s[i];
}
sort(s.begin(), s.end(),cmp);//정렬
for (int i = 0; i < s.size(); i++) {
if(s[i]!=s[i+1])
cout << s[i] <<'\n' ;//출력
}
return 0;
}
여기서는 이런 방식으로 하면
이렇게 결과가 나오고
unique 함수를 사용하는 방법은
#include<algorithm>
#include<vector>
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
bool cmp(const string &u, const string &v) {
if (u.size() == v.size())return u < v;
else return u.size() < v.size();
}
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N;// 단어 개수 입력
cin >> N;
vector<string> s(N);//문자열 저장할 백터
for (int i = 0; i < N; i++) {
cin >> s[i];
}
sort(s.begin(), s.end(),cmp);//정렬
s.erase(unique(s.begin(), s.end()),s.end());
for (int i = 0; i < s.size(); i++) {
cout << s[i] <<'\n' ;//출력
}
return 0;
}
결과가 비슷합니다. 단 여기서 이제 원래는
ios_base::sync_with_stdio(false);
이두가지가 적어져 있으면 입출력이 빨라지는 효과가 있습니다. 위에 예제에서 빼고 적용하면 이렇습니다.
순서대로 1번이 위에 소스 속도 2번이 다음 소스 속도 입니다.
메모리를 더 잡아 먹은감도 있고 속도도3배가 차이 납니다.
물론 또 이런 방식으로도 속도가 차이가 납니다.
cout << s[i] <<'\n' ;//출력
출력 하는 부분에 <<'\n; 대신 <<endl; 이라고 하면 물론 출력 결과는 같으나
속도 차이가 엄청 납니다. 이것은 함수에 들어가고 나오는 차이라고 생각하시면 이해가 쉬울꺼에요
이전의 입출력을 더 빠르게 하는 소스와 비교했을때 최대 40배나 속도 차이가 나는 것입니다.
정말 이런 사소한것이라도 알고리즘을 구현 할때 중요합니다. 알고리즘은 다 구현했는데
출력 부분에서 저렇게 시간이 걸려서 시간초과 나면 억울 하잖아요 무튼참고해주세요.