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