본문 바로가기

Algorithm/Programmers

[Programmers] [3차] 파일명 정렬

안녕하세요. 이번 포스팅에서는 Programmers 3차 파일명 정렬 문제를 풀어보도록 하겠습니다.

 

해당 문제는

https://programmers.co.kr/learn/courses/30/lessons/17686

 

코딩테스트 연습 - [3차] 파일명 정렬

파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램

programmers.co.kr

 

위 링크에서 확인하실 수 있습니다.

 

문자열 파싱&정렬 문제입니다.

 

Struct File을 하나 정의해서, originalName, head, number, idx를 저장해주었습니다.

originalName은 정답을 위해, head, number, idx는 정렬 조건을 위해 추가해 주었습니다.

*tail은 필요 없습니다.

 

문자열 파싱에서는

1. 숫자가 나올 때까지 head에 더합니다. 

2. 숫자가 나오면 숫자가 끝날 때까지 string에 더한 다음, integer형으로 변환하여 구조체에 저장해줍니다. 

3. 숫자까지 파싱이 끝났으면 루프를 종료합니다.

 

정렬에서는

1. head 값 사전 순 비교

2. number 값 대소 비교

3. idx 비교

 

순으로 진행해 주었습니다.

 

<소스 코드>

#include <bits/stdc++.h>
using namespace std;

typedef struct __file{
    string originalName, head;
    int idx, number;
}F;
bool compareFile(F& a, F& b) {
    if(a.head != b.head) return a.head < b.head;
    if(a.number != b.number) return a.number < b.number;
    
    return a.idx < b.idx;
}
vector<string> solution(vector<string> files) {
    vector<string> answer;
    vector<F> v;
    for(int i = 0; i < files.size(); i++) {
        string file = files[i];
        F new_file;
        new_file.originalName = file;
        new_file.idx = i;
        string new_head = "", new_number = "";
        bool number_flag = false;
        for(int i = 0; i < file.size(); i++) {
            if(!(file[i] >= '0' && file[i] <= '9') && !number_flag) {
                if(file[i] >= 'A' && file[i] <= 'Z') new_head += tolower(file[i]);
                else new_head += file[i];    
            }
            else if(file[i] >= '0' && file[i] <= '9') {
                number_flag = 1, new_number += file[i];    
            } else if(number_flag && !(file[i] >= '0' && file[i] <= '9')) break;
        }
        new_file.head = new_head;
        new_file.number = stoi(new_number);
        v.push_back(new_file);
    }
    sort(v.begin(), v.end(), compareFile);
    for(auto a : v) answer.push_back(a.originalName);
    return answer;
}

 

*저의 글에 대한 피드백이나 지적은 언제나 환영합니다.