[ 알고리즘 ] 프로그래머스: 문자열 내 마음대로 정렬하기

반영서·2023년 1월 13일
0

알고리즘

목록 보기
6/8
post-thumbnail

문제는 풀었으나, 내 코드보다 좀더 간결하고 빠르게 푼 코드가 있어, 비교하고 차이점을 분석해보려 작성하게 되었다.

문제 설명

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.

제한 조건

  • strings는 길이 1 이상, 50이하인 배열입니다.
  • strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
  • strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
  • 모든 strings의 원소의 길이는 n보다 큽니다.
  • 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.

입출력 예

stringsnreturn
["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를 통해 바로 기준이 되는 문자를 비교하고 정렬하였다.

profile
커지고 싶은 신입개발자

0개의 댓글