[c++/프로그래머스] [3차] 파일명 정렬*

조히·2023년 6월 13일
0

PS

목록 보기
75/82

문제 링크

[3차] 파일명 정렬

풀이

문자열커스텀 정렬로 푸는 문제
여기서 sort함수로 풀면 1,2번만 맞고 stable_sort로 푸니까 다 맞았다..
stable_sort는 두 요소 간의 순서를 보장하는 함수!
예를 들어 {1,5,4,5,3}이라는 벡터를 정렬 할 때 {1,3,4,5,5}로 정렬이 될텐데 그냥 sort는 5 요소 두 개가 같은 값이니 순서가 보장 되지 않아 앞의 5가 뒤로 갈 수 있지만, stable_sort는 이 두 개의 5 순서를 보장한다.

  1. 구조체로 File을 정의해 name에는 원래 파일명, headnumber에는 문제대로 넣기로 한다.
  2. seperate 함수를 이용해 파일명을 headnumber로 나눈다. tail은 정렬하는 데에 필요없으니 패스
    2-1. file[i]이 숫자면 numberFlagtrue로 하고 number string에 넣어준다.
    2-2. 문자인데 numberFlagfalse면 아직 number가 없었다는 뜻, 즉 head란 뜻이므로 headtoupper로 대문자 변환해서 넣어준다. 대문자 변환을 하는 이유는 문제에서 대소문자 상관없이 처리하기 위함이다.
    2-3. 문자인데 numberFlagtruetail이라는 의미이므로 처리할 필요가 없어서break
    2-4. 그렇게 완성된 headnumber를 구조체로 만들어 return. 정렬을 해야하기 때문에 numberstoi로 int 형변환을 해준다.
  3. 이제 커스텀 정렬을 해준다. 이를 위한 함수 compare은 구조체 File로 입력을 받아서 두 개의 head로 오름차순 정렬, head가 같다면 number로 정렬을 해준다.
  4. 그렇게 정렬된 arranswername만 push_back 해주면 끝.

코드

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

using namespace std;

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

File seperate(string file)
{
    string head = "";
    string number = "";
    bool numberFlag = false;
    
    for(int i=0;i<file.size();i++)
    {
        if('0'<=file[i] && file[i]<='9')
        {
            numberFlag = true;
            number+=file[i];
        }
        else
        {
            if(!numberFlag) head += toupper(file[i]);
            else break;
        }
    }

    
    File f = {file, head, stoi(number)};
    
    return f;
}

bool compare(File a, File b)
{
    if(a.head == b.head) return a.number < b.number;
    return a.head < b.head;
}

vector<string> solution(vector<string> files) {
    vector<string> answer;
    
    vector<File> arr;
    for(int i=0;i<files.size();i++)
    {
        arr.push_back(seperate(files[i]));
    }
    
    stable_sort(arr.begin(), arr.end(),compare);
    for(int i=0;i<arr.size();i++)
    {
        cout<<arr[i].head<<" "<<arr[i].number<<endl;
        answer.push_back(arr[i].name);
    }
    return answer;
}
profile
Juhee Kim | Game Client Developer

0개의 댓글