더보기
  • [ 문제 ]

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

제한 조건

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

간단해보이는 문자열 리스트를 사전순으로 오름차순으로 정렬하는 문제였습니다.

다만 조건을 잘 읽고 그 부분을 처리해주는 것에 주의를 바라는 문제인 것 같습니다.

 

  • My Code
#include <string>
#include <vector>

using namespace std;

vector<string> solution(vector<string> strings, int n) {
    vector<string> answer;
    vector<char> alphas;
    char ctmp;
    string stmp = "";

    for(int i = 0 ; i < strings.size(); i++)
        alphas.push_back(strings[i][n]);

    for(int i = 0 ; i < alphas.size()-1; i++)
    {
        for(int j = 0 ; j < alphas.size()-1;j++)
        {
            if(alphas[j] > alphas[j+1])
            {
                ctmp = alphas[j];
                alphas[j] = alphas[j+1];
                alphas[j+1] = ctmp;
                stmp = strings[j];
                strings[j] = strings[j+1];
                strings[j+1] = stmp;
            }
            else if(alphas[j] == alphas[j+1])
            {
                if(strings[j].compare(strings[j+1]) > 0)
                {
                    stmp = strings[j];
                    strings[j] = strings[j+1];
                    strings[j+1] = stmp;
                    ctmp = alphas[j];
                    alphas[j] = alphas[j+1];
                    alphas[j+1] = ctmp;
                }
            }
        }
    }
    answer = strings;
    return answer;
}

 

  • Best Code
#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];
    // 두 문자열중에 먼저 i번째 문자를 사전순으로 비교하고 같을 경우, 문자열 자체를 비교
}

vector<string> solution(vector<string> strings, int n) {
    i = n;
    sort (strings.begin(), strings.end(), compare);	// sort 함수에 default인자가 아닌 정의한 함수를 인자값으로 넘기는 것이 포인트
    return strings;
}

 

  • [ CheckPoint ]
    • sort( ) 함수를 매우 잘 쓴 경우라 볼 수 있다.
    • 나는 아직 C++ STL사용에 익숙하지 않아서인지, 버블정렬을 문자열에 반영해서 정렬 시켰다.
      코드가 매우 길어지고 비 효율적이라는 생각이 들었다.
    • 리턴값이 boolean 형태의 compare함수를 따로 정의해서 sort( ) 함수의 인자 값으로 전달하는 매우 간단한
      저 방식을 기억하자.
    • sort( ) 함수는 기본형식이 sort( 시작위치 , 끝위치, default정렬옵션 ) 이다.
      저 마지막 인자위치에 본인이 따로 정의한 함수를 인자값으로 넣어도 적용된다. 
      아직까지 본 것으론 bool 형태의 compare함수가 가장 대표적인것 같다.
728x90
반응형

+ Recent posts