본문 바로가기
프로그래머스

[프로그래머스] 2018 KAKAO BLIND RECRUITMENT - [3차] 파일명 정렬, C++

by 황인태(intaehwang) 2020. 1. 4.
반응형

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

 

코딩테스트 연습 - [3차] 파일명 정렬 | 프로그래머스

파일명 정렬 세 차례의 코딩 테스트와 두 차례의 면접이라는 기나긴 블라인드 공채를 무사히 통과해 카카오에 입사한 무지는 파일 저장소 서버 관리를 맡게 되었다. 저장소 서버에는 프로그램의 과거 버전을 모두 담고 있어, 이름 순으로 정렬된 파일 목록은 보기가 불편했다. 파일을 이름 순으로 정렬하면 나중에 만들어진 ver-10.zip이 ver-9.zip보다 먼저 표시되기 때문이다. 버전 번호 외에도 숫자가 포함된 파일 목록은 여러 면에서 관리하기 불편했다. 예

programmers.co.kr

 본 문제는 '2018 KAKAO BLIND RECRUITMENT'로 kakao Tech에 의하면 "정답률 66.95%, 언어별로는 C++과 Python 사용자들이 힘들어함."라고 한다. c++에서 주로 sort는 unstable_sort인 quick sort로 이 문제에서 제시된 "두 파일의 HEAD 부분과, NUMBER의 숫자도 같을 경우, 원래 입력에 주어진 순서를 유지한다." 조건 때문에 TC 1, 2를 제외한 나머지 TC에서 틀리게 된다.

 간단히 stable_sort와 unstable_sort에 대해 설명하자면, stable_sort는 중복된 값의 순서 유지를 보장, unstable_sort는 순서 유지를 보장하지 않는다. 

  • stable_sort - bubble, insertion, merge
  • unstable sort - selection, quick, heap 로 분류된다.

 따라서, 문제를 풀기위해서는 stable_sort를 사용해야 하는데 C++에서는 stable_sort를 지원한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
typedef struct divi { //파일명 구분
    string head;
    string num;
    string tail;
} divi;
 
bool cmp(divi a, divi b) {
    string x;
    string y;
    // head의 값을 비교하기 위해 대문자로 변경
    for (int i = 0; i < a.head.size(); i++) {
        x += toupper(a.head[i]);
    }
    for (int i = 0; i < b.head.size(); i++) {
        y += toupper(b.head[i]);
    }
    if (x.compare(y) == 0) { // head가 같을 때,
        return stoi(a.num) < stoi(b.num); // num을 비교한다.
    }
    if (x.compare(y) < 0return true;
    else return false;
}
 
vector<string> solution(vector<string> files) {
    vector<string> answer;
    vector<divi> v;
    for (int i = 0; i < files.size(); i++) {
        int index = 0;
        divi tmp;
        tmp.head = "";
        tmp.num = "";
        tmp.tail = "";
        // head는 숫자가 아닌 문자로 이루어져 있기 때문에, 숫자가 나오면 break.
        while (index != files[i].size()){
            if ((files[i][index] < '0' || files[i][index] > '9')) tmp.head += files[i][index];
            else break;
            index += 1;
        }
        // num
        while (index != files[i].size()) {
            if (files[i][index] >= '0' && files[i][index] <= '9') tmp.num += files[i][index];
            else break;
            index += 1;
        }
        // tail
        while (index != files[i].size()) {
            tmp.tail += files[i][index];
            index += 1;
        }
        v.push_back(tmp);
    }
    stable_sort(v.begin(), v.end(), cmp);
    
    for (int i = 0; i < v.size(); i++) {
        string tmp = "";
        tmp += v[i].head;
        tmp += v[i].num;
        tmp += v[i].tail;
        answer.push_back(tmp);
    }
    return answer;
}
cs

<채점 결과>

반응형
Buy me a coffeeBuy me a coffee

댓글