Algorithm/프로그래머스

[프로그래머스/C++] 신규 아이디 추천

pinevienna 2021. 2. 4. 21:10

 

 

유저가 회원가입 시에 조건에 맞지 않는 아이디를 입력한다면

아래의 7단계를 거쳐 적절한 아이디로 만들어 return하는 문제

 

1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.

2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.

3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.

4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.

5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.

6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.

           만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.

7단계 new_id의 길이가 2자 이하라면,

           new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.

 

 

그냥..시키는 대로 하면 된다

연속해서 마침표를 넣을 수 없도록 bool 변수를 사용해줬는데,

의도치 않게(?) 아이디 제일 앞 마침표를 거르게 됐다

제일 마지막에 마침표가 있는지 없는지만 체크해주면 됨

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <string>
#include <vector>
#include <deque>
using namespace std;
 
string solution(string new_id) {
    string answer = "";
    bool b = true;
 
    for (int i = 0; i < new_id.size(); i++) {
        if (b == true && new_id[i] == '.'continue//제일 처음 마침표X, 연속 마침표X
        else if (new_id[i] >= 'A' && new_id[i] <= 'Z') {
            b = false;
            answer += tolower(new_id[i]);
        }
        else 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')) {
            if (new_id[i] == '.') b = true;
            else b = false;
            answer += new_id[i];
        }
    }
 
    if (answer.empty()) answer += 'a'//5단계
    while (answer.size() > 15) answer = answer.substr(015); //6단계
    if (answer.back() == '.') answer.pop_back(); //제일 마지막 마침표X
    while (answer.size() < 3) answer += answer.back(); //7단계
 
    return answer;
}
cs

 

처음엔 deque로 풀었다가 호다닥 answer에 바로 집어넣으며 품