[ 카카오 아이디 규칙 ]
신규 유저가 입력한 아이디가 new_id라면,
1단계) new_id의 모든 대문자 → 소문자 변경
2단계) 규칙에 어긋나는 문자 제거
3단계) 연속된 마침표를 하나로 !
4단계) 처음과 끝에 있는 마침표 제거
5단계) new_id가 빈 문자열 → "a" 대입
6단계) new_id길이 ≥ 16
이면 처음부터 15자만 남김 (.으로 끝나면 .제거)
7단계) new_id길이 ≤ 2
이면 마지막 문자를 길이가 3이 될 때까지 반복 !
모든 대문자를 소문자로 변경하면서 규칙에 어긋나는 문자를 제거할 수 없을까?
(new_id에서 문자를 제거해서 new_id에 저장하기보단 answer에 저장하자 !)
① new_id 길이만큼 반복하면서 알파벳이라면 무조건 소문자로 저장
→ isalpha()
로 알파벳인지 확인 후 tolower()
로 저장
② 규칙에 어긋나는 문자는 저장하지 말기 ! → 제거하는 것과 같음
연속된 마침표를 찾아서 하나로 바꾸는 방법?
→ answer에 ".."가 존재하는 동안 replace
를 사용하여 "."로 바꿔주기 !
Source Code
#include <string> #include <vector> #include <iostream> using namespace std; string solution(string new_id) { string answer = ""; for(int i=0; i<new_id.length(); i++) { if(isalpha(new_id[i])) { // 영어라면 answer += tolower(new_id[i]); // 소문자로 바꿔주기 } else if(isdigit(new_id[i]) || new_id[i] == '-' || new_id[i] == '_' || new_id[i] == '.') { answer += new_id[i]; } } while(answer.find("..") != string::npos) { // 연속된 마침표 제거 answer.replace(answer.find(".."), 2, "."); } if(answer[0] == '.') { // 마침표가 처음에 위치하면 answer = answer.substr(1); // 제거 } if(answer[answer.length()-1] == '.') { // 마침표가 끝에 위치하면 answer = answer.substr(0, answer.length() - 1); // 제거 } if(answer == "") { answer = "a"; } if(answer.length() >= 16) { answer = answer.substr(0, 15); if(answer[answer.length() - 1] == '.') { answer = answer.substr(0, answer.length() - 1); } } if(answer.length() <= 2) { while(answer.length() < 3) { answer += answer[answer.length() - 1]; } } return answer; }
규칙에 어긋나는 문자를 제거해서 new_id에 바로 저장하려고 하다보니 복잡했다.
→ 나중엔 쉬운 방법을 찾았지만 계속해서 간단한 방법을 생각하는 연습하기 !
string 함수 중 replace 인자 값들이 헷갈려서 찾아보았음.
→ 검색하지 않고 사용할 수 있게 하기 !