• Jan
  • Feb
  • Mar
  • Apr
  • May
  • Jun
  • Jul
  • Aug
  • Sep
  • Oct
  • Nov
  • Dec
  • Sun
  • Mon
  • Tue
  • Wed
  • Thu
  • Fri
  • Sat
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

#12915 문자열 내 마음대로 정렬하기

image

문제 정리

각 문자열의 n번째 글자끼리만 비교해서 오름차순 정렬.
다 소문자 알파벳.
인덱스 1의 문자가 같은 문자열이 여러개면 사전순.

생각해보기

n번째 문자열을 뽑아서 char 아스키 코드 성질 이용해서 a=0, b=1 이런 식으로
해당 인덱스에 int값을 넣음.
그 다음에 같은 숫자인 것 끼리 새 벡터에 넣어서 사전순 정렬(sort)해주고 answer에 벡터를 push_back(append)

코드 쓰기

string 정렬은

bool comp(string s1, string s2){
  return s1 < s2; //사전순 정렬
}
// ...
string arr[5] = {"asda", ..., "asdss"};
sort(arr, arr+5, comp)

이런식으로 비교 함수를 만들어서 sort를 쓰면 가능!

내 풀이

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

bool comp(string s1, string s2){
    return s1 < s2;
}

vector<string> solution(vector<string> strings, int n) {
    vector<string> answer;
    int size = strings.size();
    vector<int> s(size, 0);
    vector<string> temp; // 같은 숫자인 것 끼리 임시로 저장해둘 벡터
    
    for(int i=0; i<strings.size(); i++){
        s[i] = strings[i].at(n) - 'a';
    }
    
    for(int i=0; i<26; i++){
        for(int k=0; k<strings.size(); k++){
            if(s[k] == i){
                temp.push_back(strings[k]);
            }
        }
        sort(temp.begin(), temp.end(), comp);
        answer.insert(answer.end(), temp.begin(), temp.end());
        temp.clear();
    }
    
    return answer;
}

풀고 나서 알게된 것

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;
}

string도 그냥 [i] 이런식으로 인덱스 접근이 가능하군아..
compare함수를 그냥 저런 식으로 쓰면 바로 해결 간으한 거였음..
sort에서 compare함수의 작동 원리를 공부해야 할 듯..