아직 string 사용이 미숙한 것 같다. 선배님의 코드가 굉장히 세련됐다고 느꼈는데, 입력받은 문자열에 대해 strtok를 수행하고 문자열을 뒤집을 때도 stack의 특성을 활용했기 때문이다.
/* 57분 소요 */
/* 1. 변수명 뒤에 추가변수형이 있을 것이라고 가정했지만 그렇지 않을 수도 있으므로 있을 경우에만 처리하기 */
/* 2. "변수명 + 추가변수형" 뒤에 바로 공백이 오는 것이 아니라 ','도 있기 떄문에 인덱스 2개씩 건너 뛰어야 */
/* 3. 공백이 아니라 ',' 또는 ';'가 오기 때문에 종결조건을 공백이 아닌 두 문자로 변경해야 */
#include <iostream>
#include <string>
#include <vector>
using namespace std;
string in, basic;
vector<string> name, add;
int namen;
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
getline(cin, in);
int i; for (i = 0; in[i] != ' '; ++i);
basic = in.substr(0, i); ++i;
for (; i < in.size(); i += 2) { /* 2 */
int j;
for (j = 0; ('a' <= in[i + j] && in[i + j] <= 'z') || ('A' <= in[i + j] && in[i + j] <= 'Z'); ++j);
name.push_back(in.substr(i, j));
i += j;
for (j = 0; in[i + j] != ',' && in[i + j] != ';'; ++j); /* 1 */ /* 3 */
string tmp;
for (int k = j - 1; k >= 0; --k) {
if (in[i + k] == ']') { tmp.append("[]"); --k; }
else tmp.push_back(in[i + k]);
}
add.push_back(tmp);
i += j;
++namen;
}
for (int namei = 0; namei < name.size(); ++namei)
cout << basic << add[namei] << ' ' << name[namei] << ";\n";
return 0;
}
아래는 선배님의 코드를 따라 작성했다.
/* 1. it >= str.end() 이면 애초에 dereference가 불가능하기 때문에 <str.end() 조건을 먼저 검사한다. */
#include <iostream>
#include <string>
#include <vector>
using namespace std;
string str;
vector<string> wds;
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
getline(cin, str);
string wd;
for (auto ch : str) {
switch (ch) {
case ' ': case ',': case ';':
if(wd.size() > 0)
wds.push_back(wd);
wd = ""; break;
default:
wd += ch; break;
}
}
for (int wdi = 1; wdi < wds.size(); wdi++) {
cout << wds[0];
for (auto rit = wds[wdi].rbegin(); !(('a' <= *rit && *rit <= 'z') || ('A' <= *rit && *rit <= 'Z')); ++rit) {
switch (*rit) {
case ']': cout << "[]"; ++rit; break;
default: cout << *rit; break;
}
}
cout << ' ';
/* 1 */
for (auto it = wds[wdi].begin(); it < wds[wdi].end() && (('a' <= *it && *it <= 'z') || ('A' <= *it && *it <= 'Z')); ++it) {
cout << *it;
}
cout << ";\n";
}
return 0;
}