#include <string>
#include <vector>
#include <iostream>
using namespace std;
string solution(string new_id) {
string answer = "";
// 1. 소문자로
for(auto n : new_id)
answer += tolower(n);
// 2. 잘못된 문자 제거
int size = answer.size();
for(int i=0; i<size; i++){
char a = answer[i];
if( (a < 'a' || a > 'z') && (a < '0' || a > '9') &&
a != '-' && a != '_' && a != '.'){
answer.erase(i, 1);
i--; size--;
}
}
// 3. 연속된 '.' 치환
size = answer.size();
bool flag = false;
for(int i=0; i<size; i++){
if(answer[i] != '.'){
flag = false;
}else{
if(flag){
answer.erase(i, 1);
i--; size--;
}else{
flag = true;
}
}
}
// 4. 처음이나 끝에 있는 '.' 제거
if(answer[0] == '.')
answer.erase(0,1);
if(answer[answer.size()-1] == '.')
answer.erase(answer.size()-1, 1);
// 5. 빈 문자열 이라면 "a" 대입
if(answer == "") answer = "a";
// 6. 16자 이상이면, 15자 제외 제거
if(answer.size() >= 16){
answer.erase(15);
if(answer[answer.size()-1] == '.')
answer.erase(answer.size()-1, 1);
}
// 7. 2자 이하라면, 3자 이상 될 때까지 마지막 문자 반복
if(answer.size() <= 2){
char c = answer[answer.size()-1];
while(answer.size() < 3){
answer += c;
}
}
return answer;
}
문제에서 예외상황까지 친절하게 알려준다.
그대로 코딩하면 쉽게 된다.
주의할 점은 string의 erase()함수를 실행하고나면,
뒤의 인덱스들이 1씩 줄고 마찬가지로 전체 길이도 1 줄어들기 때문에
for문 안에서 erase()함수를 실행했다면 이를 고려해서 i--; size--;를 해주어야 한다.
'공부 > 알고리즘' 카테고리의 다른 글
2020 카카오 코딩테스트 문자열 압축 c++ solution (0) | 2021.09.10 |
---|---|
2019 카카오 코딩테스트 실패율 c++ solution (0) | 2021.09.10 |
HackerRank Bigger is Greater c++ solution (0) | 2021.09.07 |
프로그래머스 가장 큰 수 c++ solution (0) | 2021.09.05 |
프로그래머스 위장 c++ solution (0) | 2021.09.05 |