본문 바로가기
  • 실행력이 모든걸 결정한다
Algorithm/기타 알고리즘

[시뮬레이션] 파일명 정렬 - 2018 KAKAO BLIND RECRUITMENT

by 김코더 김주역 2022. 7. 5.
반응형

해결 방법

문자열 파싱 부분은 NUMBER은 첫 연속 숫자열만 반영해야 한다는 사실만 잘 고려하면 어렵지 않을 것이다.

파일의 TAIL 부분은 파일 정렬에 고려하지 않기 때문에 TAIL 부분은 신경쓰지 않아도 되지만, 두 파일의 HEAD 부분과 NUMBER 부분이 모두 같을 때는 입력 벡터의 인덱스 순으로 정렬해야 하기 때문에 입력 인덱스까지는 고려해줘야 한다.

그래서 파일의 인덱스, HEAD 부분, NUMBER 부분에 해당하는 파일 구조체를 만들어두면 문제를 쉽게 해결할 수 있다. 

또, 문자의 대소문자를 판별할 때나, 정수 여부를 판별하는 경우에는 아스키 코드를 이용하면 편리하고, 정수 문자열을 정수로 바꿀 때는 stoi 함수를 이용하면 편리하다. stoi 함수는 앞 부분에 0이 여러 개 붙더라도 이를 제거하여 정수로 변환해준다.

 

 

소스코드

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

struct File {
    int idx;
    string head;
    string number;
};

vector<File> file_vec;

string to_lower(string s) {
    for(int i=0;i<s.length();i++) if(s[i]>=65&&s[i]<=90) s[i]+=32;
    return s;
}

File parser(string s) {
    File file;
    int num_start=-1;
    int tail_start=-1;
    for(int i=0;i<s.length();i++) {
        if(s[i]>=48&&s[i]<=57&&num_start==-1) { // 첫 숫자 발견
            num_start=i;
            file.head=s.substr(0, num_start);
        }
        if(!(s[i]>=48&&s[i]<=57)&&num_start!=-1&&tail_start==-1) { // NUMBER 이후 숫자가 아닌 첫 문자 발견
            tail_start=i;
            file.number=s.substr(num_start, tail_start-num_start);
        }
    }
    if(tail_start==-1) file.number=s.substr(num_start);
    return file;
}

bool compare(File f1, File f2) {
    if(to_lower(f1.head)==to_lower(f2.head)&&stoi(f1.number)==stoi(f2.number)) return f1.idx<f2.idx;
    else if(to_lower(f1.head)==to_lower(f2.head)) return stoi(f1.number)<stoi(f2.number);
    else return to_lower(f1.head)<to_lower(f2.head);
}

vector<string> solution(vector<string> files) {
    vector<string> answer;
    for(int i=0;i<files.size();i++) {
        File f = parser(files[i]);
        f.idx=i;
        file_vec.push_back(f);
    }
    sort(file_vec.begin(), file_vec.end(), compare);
    for(int i=0;i<file_vec.size();i++) answer.push_back(files[file_vec[i].idx]);
    return answer;
}

 

테스트케이스 20개 모두 정답

반응형

댓글