문제는 풀었으나, 내 코드보다 좀더 간결하고 빠르게 푼 코드가 있어, 비교하고 차이점을 분석해보려 작성하게 되었다.
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
| strings | n | return |
|---|---|---|
| ["sun", "bed", "car"] | 1 | ["car", "bed", "sun"] |
| ["abce", "abcd", "cdx"] | 2 | ["abcd", "abce", "cdx"] |
입출력 예 1"sun", "bed", "car"의 1번째 인덱스 값은 각각 "u", "e", "a" 입니다. 이를 기준으로 strings를 정렬하면 ["car", "bed", "sun"] 입니다.
입출력 예 2"abce"와 "abcd", "cdx"의 2번째 인덱스 값은 "c", "c", "x"입니다. 따라서 정렬 후에는 "cdx"가 가장 뒤에 위치합니다. "abce"와 "abcd"는 사전순으로 정렬하면 "abcd"가 우선하므로, 답은 ["abcd", "abce", "cdx"] 입니다.
문제 출처: 프로그래머스
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int gn;
bool compare(pair<char, string> a, pair<char, string> b) {
if(a.first == b.first) {
return a.second < b.second; // 기준 문자가 같다면, 사전 순으로 다른 문자까지 정렬
}
return a.first < b.first; // 그렇지 않다면, 기준 문자를 기준으로 정렬
}
vector<string> solution(vector<string> strings, int n) {
gn = n;
vector<string> answer;
vector<pair<char, string>> sd; // 기준이 되는 문자와, 문자열을 저장할 pair vector 생성
for(auto &s :strings) {
sd.push_back(pair<char, string>(s[n], s));
}
sort(sd.begin(), sd.end(), compare);
for(auto &data : sd) {
answer.push_back(data.second); // answer에 저장된 정렬된 pair의 문자열을 push
}
return answer;
}
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int gn;
bool compare(string a, string b) {
return a[gn] == b[gn] ? a < b : a[gn] < b[gn];
}
vector<string> solution(vector<string> strings, int n) {
gn = n;
sort(strings.begin(), strings.end(), compare);
return strings;
}
코드를 살펴보고, 문제 해결 아이디어 자체는 같다는 것을 알았다.
하지만, 코드 길이로도, 연산량으로도 차이가 났던 점은, 나는 새로운 기준이 되는 문자열을 저장하기 위한 벡터를 새로 생성했던 것에 비해,
아래 코드에서는 정렬 조건에서 random access를 통해 바로 기준이 되는 문자를 비교하고 정렬하였다.