Algorithm/Programmers
[프로그래머스] 신규아이디 추천 : C++
감성적인 개발자
2021. 8. 14. 22:03
https://programmers.co.kr/learn/courses/30/lessons/72410
코딩테스트 연습 - 신규 아이디 추천
카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로
programmers.co.kr
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
// 8월 6일자 구현 중 ...
string solution(string new_id) {
/* 허용하는 소문자, 숫자, 기호가 담긴 배열 생성 */
int start_length = new_id.length();
/* 1. 대문자 -> 소문자 */
for(int i = 0; i < new_id.length(); i++){
if(new_id[i] >= 65 && new_id[i] <= 90) new_id[i] += 32;
}
/* 2. 표준 문자 제외 제거 */
for(int i = 0; i < new_id.length();){
if(!isalpha(new_id[i]) && !isdigit(new_id[i]) && new_id[i] != '-' && new_id[i] != '_' && new_id[i] != '.'){
new_id.erase(new_id.begin() + i);
}
else i++;
}
/* 3. 연속 마침표 제거 */
for(int i = 0; i < new_id.length();){
if(new_id[i] == '.' && new_id[i+1] == '.'){
new_id.erase(new_id.begin() + i);
} else i++;
}
/* 4. 양 끝단 마침표 제거 */
if(new_id[0] == '.') new_id.erase(new_id.begin());
if(new_id[new_id.length() - 1] == '.') new_id.erase(new_id.length()-1,new_id.length());
/* 5. 길이가 0이면 a 리턴 */
if(new_id.empty()) new_id.push_back('a');
/* 6. 15 이상이면 자르고 끝 부분만 "." 체크 */
if(new_id.length() > 15) new_id.erase(15,new_id.length());
if(new_id[new_id.length()-1] == '.') new_id.erase(new_id.length()-1,new_id.length());
/* 7. 길이 2 이하면 3으로 */
char last_char = new_id[new_id.length()-1];
while(new_id.length() < 3){
new_id += last_char;
}
return new_id;
}
string 제거함수인 erase사용이 익숙하다면 어렵지 않지만, 나는 그러지못했다...
허용되는 소문자, 대문자, 숫자, 특수기호 사전을 생성한 뒤 find 함수를 통해 체크하려했지만 아스키코드 변환도 머리아프고 라이브러리 검색 중 isalpha()와 isdigit()이라는 함수를 알게되어 과감히 사용.
삽질한 코드
vector<char> standard = {'-', '_', '.'};
int start_a = 97;
int start_num = 48;
for(int i = 0; i< 26; i++){
standard.push_back(start_a);
start_a++;
}
for(int i = 0; i < 10; i++){
standard.push_back(start_num);
start_num++;
}
이제와서 체크해보니 소문자, 대문자는 잘 넣어놓고, 숫자를 그대로 0~9로 입력한 뒤 find함수를 사용했었다. 덕분에 isdit()과 isalpha()를 만났으니 다음부턴 이런 짓을 안해도 될거같다.