본문 바로가기
알고리즘/c++ 프로그래머스

[프로그래머스 파일명정렬] c++ (풀이,코드,카카오3차코테)

by 말린밴댕이_공부 2023. 6. 1.
반응형

문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

 

풀이 및 코드

사실 이 문제는 이제 점점 문자열 처리에 대해서 한번더 근접하는 시간이 되지 않았나 싶습니다.

 

사실 두개 정도를 비교할때는 이중벡터나 pair를 사용해서 하려 했지만 

 

갑자기 구조체가 떠올랐습니다.

 

이럴때 구조체 쓰라는거 아닐까 합니다.

 

1. 일단 모든것을 나눠서 구조체 head, number,tail, index(index는 head,number가 다 동일한 경우) 백터에 넣습니다.

     -> head는 숫자가 오기전까지 / number는 길이가 5이하까지 그리고 숫자가 아닐때까지 / 그다음 마지막은 다 tail에

2. 정렬을 합니다. (정렬 순서는 head기준 -> 같다면 number기준 -> 이것도 같다면 index기준)

      정렬 기준

     1)  head는 모두 소문자 변환후 비교(하지만 나중에는 원본 그대로)

     2)  number는 일단 다 받아오고 stoi를 진행

3. answer에 이제 만든 벡터 v의 index순으로 push_back을 합니다.

/*
파일명 정렬
숫자순으로 정렬 -> 파일명에 포함된 숫자를 반영한 정렬 기능을 저장소 관리 프로그램 구현
대소문자,숫자,공백,마침표,빼기부호
head -> 숫자가 아닌 문자 최소 한글자 이상
number -> 한글자에서 최대 다섯글자 0 ~ 99999 숫자! => 0001은 000 무시 1임
tail은 나머지 -> 아무 글자도 없을 수 있음

대소문자를 구분하지 않음 -> 소문자 통일해야겠다.
head : 사전 순으로 정렬 , number : 숫자순 정렬
head -> number순이고 둘다 같으면 주어진 시간순.

1. head,number,tail,index를 struct가 형인 vector에 넣는다
2. 정렬한다. (head순 -> 같다면 number순 -> 두개다 같다면 index순 정렬 끝!)
*/
#include <string>
#include <vector>
#include <cctype>
#include <algorithm>
#include <string>
#include <iostream>

using namespace std;

struct Dict {
    string head;
    string number;
    string tail;
    int index;
};

bool isNumber(char c){
    return('0' <= c && c <= '9');
}

bool compareDicts(const Dict& a, const Dict& b) {
    string strA = a.head;
    string strB = b.head;
    int numA = stoi(a.number);
    int numB = stoi(b.number);

    //비교시에만 소문자로 비교를 하고 원래의 값을 리턴해야함
    for (char& c : strA) {
        c = tolower(c);
    }
    for (char& c : strB) {
        c = tolower(c);
    }
   
    //정렬의 순서에 대해서 다 넣음
    if (strA == strB) {
        if (numA == numB) {
            return a.index < b.index; //head같,number같 -> index순
        } else {
            return numA < numB;  // head같 -> number순
        }
    } else {
        return strA < strB;  // head순
    }
}

vector<string> solution(vector<string> files) {
    vector<string> answer;
   
    vector<Dict> v;
    string head_tmp = "";
    string number_tmp = "";
    string tail_tmp = "";

    //head,number,tail,index vector에 push_back
    for(int i = 0; i < files.size();i++){
        int j = 0;
        head_tmp = ""; //head 초기화
        while(!isNumber(files[i][j])){
            head_tmp += files[i][j];
            j++;
        }
        number_tmp = ""; // num초기화
        while(isNumber(files[i][j]) && number_tmp.length() < 5){
            number_tmp += files[i][j];
            j++;
        }
        tail_tmp ="";
        while(files[i][j]){
            tail_tmp += files[i][j];
            j++;
        }
        cout<<head_tmp <<"  "<<number_tmp << "  "<<tail_tmp<< "   "<<i<<"\n";
        cout<<"stoi_number = "<<stoi(number_tmp)<<"\n";
        Dict tmpDict{head_tmp, number_tmp,tail_tmp,i};
        v.push_back(tmpDict);
    }
   
    sort(v.begin(),v.end(),compareDicts);
   
    for(const auto& dict : v) {
        answer.push_back(files[dict.index]);
    }
    return answer;
}

 

좀 시간이 많이 걸린 문제라고 생각합니다.

 

앞으로는 구조체 자주 사용해야지 히힣

반응형

댓글