코딩 테스트

[프로그래머스] 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를 통해 정렬할 때 첫 번째 자료형의 값이 같은 경우, 두 번째 자료형의 비교도 수행한다고 한다.