[프로그래머스] 신규 아이디 추천(C++)
in CodingTest
#include <string>
#include <vector>
#include <algorithm>
#include <cctype>
using namespace std;
string solution(string new_id) {
string answer = "";
// 1
for (int i = 0; i < new_id.size(); i++) {
new_id[i] = tolower(new_id[i]);
}
// 2
vector<int> temp;
for (int i = 0; i < new_id.size(); i++) {
if ((new_id[i] != '.') && (new_id[i] != '-') && (new_id[i] != '_') && (isalpha(new_id[i])==0) && (isdigit(new_id[i])==0)) {
temp.push_back(i);
}
}
if (temp.size() != 0) {
int index = 1;
for (vector<int>::size_type i = 0; i < temp.size() - 1; i++) {
new_id.erase(new_id.begin() + temp[i]);
temp[i + 1] -= index++;
}
new_id.erase(new_id.begin() + *(temp.end() - 1));
}
// 3
for(int i = 1; i < new_id.length(); ){
if (new_id[i] == '.' && new_id[i - 1] == '.'){
new_id.erase(new_id.begin() + i);
continue;
}
else i++;
}
// 4
if (*(new_id.begin()) == '.' ) {
new_id.erase(new_id.begin());
}
if (new_id.size() != 0) {
if (*(new_id.end() - 1) == '.') {
new_id.erase(new_id.end() - 1);
}
}
// 5
if (new_id.size() == 0) {
new_id += "a";
}
// 6
if (new_id.size() >= 16) {
new_id.erase(new_id.begin() + 15, new_id.end());
if (*(new_id.end() - 1) == '.') {
new_id.erase(new_id.end() - 1);
}
}
// 7
if (new_id.size() <= 2) {
char temp = *(new_id.end() - 1);
while (new_id.size() < 3) {
new_id += temp;
}
}
answer+=new_id;
return answer;
}
이번 문제는 문자열을 얼마나 내 마음대로 다룰 수 있는지가 중요한 것 같다.
새롭게 알게 된 함수는 다음과 같다. 헤더 파일은 <cctype>이다.
// tolower() : 대문자를 소문자로 바꿔주는 함수 // toupper() : 소문자를 대문자로 바꿔주는 함수 // isalpha() : 알파벳인지 확인해주는 함수 ( 대문자: 1, 소문자: 2, 알파벳이 아니면 0을 반환) // isdigit() : 숫자인지 판단하는 함수 (숫자면 true, 아니면 false 반환)
물론 나는 문제에서 주어진 조건을 하나하나 해결하면서 풀었지만 최적화는 아니다. 다음에 더 코드를 줄이는 방법을 생각해서 풀어봐야겠다.