ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] Level1 - 문자열 내 마음대로 정렬하기
    코딩 테스트 2022. 9. 11. 13:45

    1. 문제 설명

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

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

    문자열이 저장된 벡터를 함수 인자로 주어진 n 위치의 문자의 알파벳 순서 기준으로 정렬하는 문제이다.

    만약 비교 대상안 두 string의 위치 n의 문자가 같다면, string의 사전순으로 정렬한다. 

    2. 나의 풀이

    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    class CCompare
    {
    public:
        static void SetIndex(const int Index)
        {
            m_Index = Index;
        }
        
        static bool Greater(const string& Lhs, const string& Rhs)
        {
            if (Lhs[m_Index] != Rhs[m_Index])
            {
                return Lhs[m_Index] < Rhs[m_Index];
            }
            else
            {
                return Lhs < Rhs;
            }
        }
        
    private:
       static int m_Index; 
    };
    
    int CCompare::m_Index = 0;
    
    vector<string> solution(vector<string> strings, int n) 
    {
        CCompare::SetIndex(n);
        
        sort(strings.begin(), strings.end(), CCompare::Greater);
        
        return strings;
    }

    3. 해설

    sort 함수의 3번째 인자로 비교 함수를 넣어주어서 정렬하려고 했는데, 이 비교 함수에 n을 전달해주어야 주어진 기준으로 정렬할 수 있다.

    즉, 비교 함수가 n이라는 값에 접근할 수 있어야 하는데, 나는 이를 클래스 안에 static 변수로 int값으로 멤버를 선언하고 클래스 안에 static 비교 함수를 만들어서 sort의 인자로 넣어주었다.

    sort함수의 비교 함수는 비교할 두 값의 레퍼런스만 인자로 받아야 하기 떄문에 클래스의 비교 함수도 static으로 작성해 주었다.

    4. 다른 사람들의 풀이

    #include <string>
    #include <vector>
    #include <algorithm>
    using namespace std;
    int i;
    
    bool compare (string a, string b) {
        return a[i] == b[i] ? a < b : a[i] < b[i];
    }
    
    vector<string> solution(vector<string> strings, int n) {
        i = n;
        sort (strings.begin(), strings.end(), compare);
        return strings;
    }

    이런 쉬운 방법이 있었다....

    비교 함수가 n에만 접근할 수 있으면 되니까 전역 변수를 하나 선언해놓고 비교함수에서 Index값으로 쓰면 되는구나...

     

    또 다른 방법도 재밌었다.

    #include <string>
    #include <vector>
    #include <algorithm>
    #include <functional>
    
    using namespace std;
    
    vector<string> solution(vector<string> strings, int n) {
        vector<pair<char, string>> container;
        for(int i=0; i<strings.size(); i++)
            container.push_back(make_pair(strings[i][n], strings[i]));
        sort(container.begin(), container.end());
    
        vector<string> answer;
        for(int i=0; i<container.size(); i++)
            answer.push_back(container[i].second);
        return answer;
    }

    pair를 사용한 방식인데, pair자료형의 경우 sort를 통해 정렬할 때 첫 번째 자료형의 값이 같은 경우, 두 번째 자료형의 비교도 수행한다고 한다.

    댓글

GameDev.