937. Reorder Data in Log Files

선우·2023년 1월 3일
0
post-thumbnail

Approach

  • 문자열과 정수를 구분해줄 벡터 letters, digits 선언.
  • logs로부터 문자열 하나씩 받아와서 끝부분을 통해 정수인지 문자인지 구별하여 각각에 맞는 letters, digits 변수로 넣어준다.
  • algorithm 라이브러리 함수인 sort를 통해 letters에 저장된 문자들을 정렬해준다.
  • 정렬해줄때 compare 함수를 활용하는데 이 함수는 letters에 저장되어있는 문자들에서 앞부분을 제외하고 뒷부분만 비교한다.
  • 뒷부분만 비교하기위해서 식별자인 첫번째 단어를 제거해야하는데 각각의 단어들은 ' '공백으로 나뉘어져있어서 find함수를 통해서 맨 처음 ' '를 찾아 해당 인덱스부터 끝까지 나누어주는 substr()함수를 통해 비교하고자하는 문자열 s1, s2의 뒷부분을 s1_back, s2_back에 저장해준다.

Code

class Solution {
public:
    static bool compare(string s1,string s2){
        string s1_back = s1.substr(s1.find(' '));
        string s2_back = s2.substr(s2.find(' '));
       
        return s1_back == s2_back ? s1 < s2 : s1_back < s2_back;
    }

    vector<string> reorderLogFiles(vector<string>& logs) {
        vector<string> letters;
        vector<string> digits;

        for(int i = 0; i < logs.size(); i++)
        {
            string c = logs[i];
            if(c[c.length()-1] >= '0' && c[c.length()-1] <= '9') digits.push_back(c);
            else letters.push_back(c);
        }

        sort(letters.begin(), letters.end(), compare);

        for(int i = 0; i < letters.size(); i++)
        {
            logs[i] = letters[i];
        }

        for(int i = letters.size(); i < letters.size()+digits.size(); i++)
        {
            logs[i] = digits[i-letters.size()];
        }

        return logs;
    }
};

Result


추가적인 해결방법

  • stable_partition() 함수를 통해 log.begin() 처음부터, log.end() 끝까지에서 각각의 문자열의 첫번째 ' '공백자리 인덱스에서 +1을 더한 값이 isalpha()를 통해 문자인지 아닌지를 구별하여 정수, 문자 그룹으로 나눈다.
class Solution {
public:
    vector<string> reorderLogFiles(vector<string>& logs) {
        // We can break this problem into two tasks: 1) Parition 2) Sort letter-logs

        // Partition: letter-logs at the front, digit-logs at the back.
        // We're using stable_partition instead of partition to retain the original order.
        // stable_partition returns an iterator to the first element of the second group.
       
        auto it = stable_partition(logs.begin(), logs.end(), [](const string& str) {
            return isalpha(str[str.find(' ') + 1]);
        });

        // Sort letter-logs: We're only iterating on letter-logs in this case.
        // We're creating a substring for every element we compare that doesn't include the identifier
        // If the logs are the same except the identifier, we compare the strings, otherwise, the substrings
       
        sort(logs.begin(), it, [](const string& str1, const string& str2) {
            auto substr1 = string(str1.begin() + str1.find(' '), str1.end());
            auto substr2 = string(str2.begin() + str2.find(' '), str2.end());
            return (substr1 == substr2) ? str1 < str2 : substr1 < substr2;
        });
       
        return logs;
    }
};
profile
누누의 잡다저장소

0개의 댓글