[Programmers - c++] 신규 아이디 추천
https://programmers.co.kr/learn/courses/30/lessons/72410
코딩테스트 연습 - 신규 아이디 추천
카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로
programmers.co.kr
그냥 시키는 대로 하면 되는 문제이다. 다만 문자열 처리하는 것을 c++ 로 하기는 참 힘들다. 하루 빨리 java 로 갈아타야하는데 c++에 너무 익숙해서 처음부터 java 로 하기는 쉽지 않다. 언제쯤 갈아타지
1단계
for(int i=0; i<new_id.length(); i++){
if(new_id[i]>='A' && new_id[i] <= 'Z'){
new_id[i] = tolower(new_id[i]);
}
}
tolower 함수를 이용해서 만약 알파벳 대문자이면 소문자로 바꾸어준다.
2단계
for(int i=0; i<new_id.length(); i++){
if(new_id[i]=='-' || new_id[i]=='_' || new_id[i]=='.' || (new_id[i]>='0' && new_id[i] <= '9') || (new_id[i] >='a' && new_id[i] <= 'z')){
}
else{
new_id.erase(new_id.begin()+i,new_id.begin()+i+1);
i--;
}
}
알파벳, 소문자, 숫자, 빼기, 마침표가 아니면 erase 함수로 그 문자를 지워준다. 단 erase 함수로 문자열 일부를 지우게 되면 문자열 길이가 바뀐다. 그래서 반드시 i-- 를 해주어야 한다.
3단계
while(1){
auto c = new_id.find("..");
if(c==string::npos) break;
new_id.replace(c,2,".");
}
.... 들을 . 으로 바꾸는 단계이다. ".." 을 못 찾을 때까지 ".." 을 "." 으로 바꾸는 것을 반복하면 . 이 3개 이상 있어도 상관없어진다.
4단계
if(new_id[0]=='.') new_id.erase(new_id.begin(),new_id.begin()+1);
if(new_id[new_id.length()-1]=='.') new_id.erase(new_id.end()-1,new_id.end());
처음과 끝에 있는 . 을 지운다. 꼭 마지막 문자를 가리킬때 new_id.length()-1 이런 식으로 해야하는 지 짜증난다. 더 편한 방법이 있을텐데 뭔지 모르겠다.
5단계
if(new_id.length()==0){
new_id += "a";
}
빈 문자열이 되어버리면 a 를 추가한다.
6단계
if(new_id.length() >= 16){
new_id = new_id.substr(0,15);
if(new_id[new_id.length()-1]=='.'){
new_id.erase(new_id.end()-1,new_id.end());
}
}
문자열 길이가 16이상이라면 앞에 15개 문자만 사용한다. 그리고 마지막 문자가 . 이라면 그것도 없애준다.
7단계
if(new_id.length() <= 2){
while(new_id.length()<3){
new_id += new_id[new_id.length()-1];
}
}
문자열 길이가 2 이하이면 문자열의 길이가 3 이 되게 마지막 문자를 반복해서 더해준다.
빨리 자바나 파이썬으로 바꿔야 한다...
아래는 전체 코드이다.
#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <string>
#include <cmath>
#include <vector>
#include <math.h>
#include <algorithm>
#include <list>
#include <stack>
#include <queue>
#include <deque>
#include <tuple>
#include <utility>
#include <typeinfo>
#include <iomanip>
#include <set>
#include <map>
#include <cctype>
using namespace std;
string solution(string new_id) {
vector<char> v;
for(int i=0; i<new_id.length(); i++){
if(new_id[i]>='A' && new_id[i] <= 'Z'){
new_id[i] = tolower(new_id[i]);
}
}
for(int i=0; i<new_id.length(); i++){
if(new_id[i]=='-' || new_id[i]=='_' || new_id[i]=='.' || (new_id[i]>='0' && new_id[i] <= '9') || (new_id[i] >='a' && new_id[i] <= 'z')){
}
else{
new_id.erase(new_id.begin()+i,new_id.begin()+i+1);
i--;
}
}
while(1){
auto c = new_id.find("..");
if(c==string::npos) break;
new_id.replace(c,2,".");
}
if(new_id[0]=='.') new_id.erase(new_id.begin(),new_id.begin()+1);
if(new_id[new_id.length()-1]=='.') new_id.erase(new_id.end()-1,new_id.end());
if(new_id.length()==0){
new_id += "a";
}
if(new_id.length() >= 16){
new_id = new_id.substr(0,15);
if(new_id[new_id.length()-1]=='.'){
new_id.erase(new_id.end()-1,new_id.end());
}
}
if(new_id.length() <= 2){
while(new_id.length()<3){
new_id += new_id[new_id.length()-1];
}
}
return new_id;
}