[ 프로그래머스 ] [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 라이센스를 따릅니다.