-
[프로그래머스] 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를 통해 정렬할 때 첫 번째 자료형의 값이 같은 경우, 두 번째 자료형의 비교도 수행한다고 한다.
'코딩 테스트' 카테고리의 다른 글
[프로그래머스] Level1 - 완주하지 못한 선수 (0) 2022.09.20 [프로그래머스] Level1 - 다트 게임 (0) 2022.09.15 [프로그래머스] Level 1 - 소수 찾기 (0) 2022.09.06 [프로그래머스] Level 1 - 시저 암호 (0) 2022.09.05 [프로그래머스] Level 1 - 약수의 합 (0) 2022.09.02