포스트

[ 프로그래머스 ] [3차] 파일명 정렬

문제


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

풀이


주어진 문자열을 조건에 맞게 정렬하는 문제로, 문자열을 HEAD, NUMBER, TAIL로 나눠 정렬 기준에 맞게 정렬을 구현했다.

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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

bool compare(tuple<string, int,int>a, tuple<string, int,int>b)
{

    if (get<0>(a) == get<0>(b))
    {
        return get<1>(a) < get<1>(b);
    }

    return get<0>(a) < get<0>(b);

}


vector<string> solution(vector<string> files) 
{
    vector<string> answer;
    vector<string>head, tail;
    vector<int>number;

    for (int i = 0; i < files.size(); i++)
    {
        int idx = 0;
        int state = 0;
        string s = "";
   
        for (; idx < files[i].size(); idx++)
        {
            //divide head
            if (state == 0)
            {
                if (files[i][idx] >= '0' && files[i][idx] <= '9')
                {
                    head.push_back(s);
                    state = 1;
                    idx--;
                    s = "";
                }

                else
                {
                    s += toupper(files[i][idx]);

                    if (files[i][idx + 1] >= '0' && files[i][idx + 1] <= '9')
                    {
                        head.push_back(s);
                        state = 1;
                        s = "";
                    }
                }
            }

            //divide number
            else if (state == 1)
            {
                if (files[i][idx] < '0' || files[i][idx] > '9')
                {
                    int a = stoi(s);
                    number.push_back(a);
                    state = 2;
                    idx--;
                    s = "";
                }

                else
                {
                    s += toupper(files[i][idx]);

                    if (idx == files[i].size() - 1)
                    {
                        int a = stoi(s);
                        number.push_back(a);
                        state = 2;
                        s = "";
                    }
                }
            }

            //divide tail
            else if (state == 2)
            {
                break;
            }

        }

    }

    //1. 문자열 알파벳 순 
    //2. 앞에 0을 제외한 숫자 
    //3. 나머지 (빈 칸도 포함)

    //sorting 시 head 비교, number비교, 둘다 같다면 원래 순서대로
    vector<tuple<string, int,int> >a;
    
    for (int i = 0; i < files.size(); i++)
    {
        string s1 = "";
        s1 += head[i];
        a.push_back(make_tuple(s1, number[i],i));
    }

    stable_sort(a.begin(), a.end(), compare);

    for (int i = 0; i < files.size(); i++)
    {
        answer.push_back(files[get<2>(a[i])]);
    }

    return answer;
}


이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.