-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathboj1181.cpp
119 lines (92 loc) · 2.25 KB
/
boj1181.cpp
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
119
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void merge(vector<string>& v, int start, int end, int m);
void mergeSort(vector<string>& v, int start, int end);
int main()
{
/*
int N;
cin >> N;
string* strPtr = new string[N];
for (int i = 0; i < N; i++)
cin >> strPtr[i];
for (int i = 0; i < N; i++)
cout << strPtr[i].length() << endl;
for (int i = 0; i < N; i++)
{
}
for (int i = 0; i < N; i++)
cout << strPtr[i] << endl;
*/
// merge sort
int n;
cin >> n;
vector<string> vec(n);
for (int i = 0; i < n; i++)
{
string tmp;
cin >> tmp;
vec[i] = tmp;
//vec.push_back(tmp) 이러면 ""공백 뒤에 들어가서 의도한대로 안된다.
}
//cout << "len : " << vec.size() << endl;
//cout << vec[n - 1] << endl;
mergeSort(vec, 0, n - 1);
for (int i = 0; i < n; i++)
{
if (i > 0 && vec[i] == vec[i - 1])
continue;
cout << vec[i] << endl;
}
}
void merge(vector<string>& v, int start, int end, int mid)
{
vector<string> res;
int i = start;
int j = mid + 1, copy = 0;
int idx = 0;
while (i <= mid && j <= end)
{
char chi = v[i][idx], chj = v[j][idx];
cout << "--" << v[i] << " " << v[j] << "--" << endl;
if (v[i] == v[j]) {
cout << v[i] << " == " << v[j] << endl;
res.push_back(v[i++]);
res.push_back(v[j++]);
idx = 0;
}
//if(v[i]!=v[j])
else
{
if (v[i].size() < v[j].size()) { res.push_back(v[i++]); idx = 0; }
else if (v[i].size() > v[j].size()) { res.push_back(v[j++]); idx = 0; }
else if (chi < chj) { res.push_back(v[i++]); idx = 0; }
else if (chi > chj) { res.push_back(v[j++]); idx = 0; }
else idx++;
}
//if (i != start || j != mid + 1) idx = 0;
cout << "i : " << i << ", j :" << j << ", start :" << start << ", mid :" << mid << ", end :" << end << endl << "vector -> ";
for (int k = 0; k <= end; k++)
cout << v[k] << " ";
cout << endl;
}
while (i <= mid) res.push_back(v[i++]);
while (j <= end) res.push_back(v[j++]);
for (int x = start; x <= end; x++)
v[x] = res[copy++];
for (int i=0;i<=end;i++)
cout << v[i] << " ";
cout << "\n\n";
}
void mergeSort(vector<string>& v, int start, int end)
{
if (start < end) // n < n break..
{
int mid = (start + end) / 2;
mergeSort(v, start, mid);
mergeSort(v, mid + 1, end);
merge(v, start, end, mid);
}
}