Algorithm

[프로그래머스 level2] 파일명 정렬 C++

유자바 2024. 10. 5. 10:06

 

 

프로그래머스

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

programmers.co.kr

 

  • 입력
    • 1000개 이하의 파일명이 있는 files
  • 출력
    • 규칙에 따라 파일명이 올바르게 정렬된 배열
  • 규칙
    • head: 알파벳 순 (대소문자 구분 x)
    • number: 9 < 10 < 0011 < 012 < 13 < 014 순, 012와 12는 정렬 시에 같은 값
    • tail: files 배열에서 먼저 나오는 순서로 정렬
  • 풀이 방법
    • head, number, tail 찾기 -> 문자열에서 숫자가 나오는 인덱스 체크
    • 구조체를 사용해 파일명을 head, number, idx로 나누어 저장
    • head, number, 원래 파일 순서로 정렬 (tail은 정렬에 사용되지 x)

풀이

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

using namespace std;

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

vector<filename> v;

bool compare(const filename& a, const filename& b){
    if (a.head == b.head){
        if (a.number == b.number){
            return a.idx < b.idx;
        } else return a.number < b.number;
    } else return a.head < b.head;
}

vector<string> solution(vector<string> files) {
    vector<string> answer;
    
    for (int i=0;i<files.size();i++){
        vector<int> index;
        
        for (int j=0;j<files[i].size();j++){
            if ('0'<=files[i][j] && files[i][j]<='9'){
                index.push_back(j);
            }
        }
        
        string head = "";
        for (int j=0;j<index[0];j++){
            head += tolower(files[i][j]);
        }
        
        string number = files[i].substr(index[0], index.size());
        
        filename f;
        f.idx = i;
        f.head = head;
        f.number = stoi(number);
        
        v.push_back(f);
    }
    
    sort(v.begin(), v.end(), compare);
    for (int i=0;i<v.size();i++){
        answer.push_back(files[v[i].idx]);
    }
    
    return answer;
}

 

이 문제에서 가장 먼저 떠올려야 하는 것은 head, number, tail을 어떻게 나눠서 저장할 것이냐이다. 내 방법은 구조체 사용하기 였고, compare 함수를 사용해 규칙대로 정렬을 수행했다. 또한 문자열 관련 함수를 적절히 사용할 수 있는 것도 중요하다. substr의 쓰임이라던지, tolower 함수를 사용해 대소문자의 구분을 없애주는 것이 문제의 핵심이라 할 수 있다.