본문 바로가기

Study/Programmers

프로그래머스 - 신규 아이디 추천(2021 KAKAO BLIND RECRUITMENT)

String을 이용한 구현문제였다. String에 대한 표준함수들을 많이 알 수록 이 문제를 더 쉽게 풀 수 있었던 것 같다.

 

코드 

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <string>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
 
string my_lowcase(string s)
{
    for(int i=0; i<s.size(); i++)
    {
        if (s[i] >= 'A' && s[i] <= 'Z')
            s[i] += 32;
    }
    return s;
}
 
string solution(string new_id) {
    string answer = my_lowcase(new_id);
    for(int i=0; i<answer.size(); i++)
    {
        if ((answer[i] >= '0' && answer[i] <= '9'|| 
           (answer[i] >= 'a' && answer[i] <= 'z'))
            continue;
        if (answer[i] == '-' || answer[i] == '_' || answer[i] == '.')
            continue;
        answer.erase(i, 1);
        i--;
    }
    for(int i=0; i<answer.size(); i++)
    {
        if (answer[i] == '.')
        {
            int j = i + 1;
            while (answer[j] == '.')
                j++;
            if (j - i >= 2)
            {
                answer.erase(i + 1, j - i - 1);
            }
        }
    }
    if (answer.front() == '.') answer.erase(answer.begin());
    if (answer.back() == '.') answer.pop_back();
    if (answer.size() == 0) answer += "a";
    if (answer.size() >= 16) answer = answer.substr(015);
    if (answer.back() == '.') answer.pop_back();
    if (answer.size() <= 2)
    {
        string tmp = "";
        tmp += answer.back();
        while (answer.size() < 3)
            answer += tmp;
    }
    return answer;
}
cs

string도 vector와 비슷하게 front, back, pop_back 등을 사용할 수 있고 substr이나 erase함수는 어떻게 사용하는 지 알아두면 다양한 문제에 사용할 수 있을 것 같다. 

단, erase를 쓰게 될 경우 반복문 내에서 iterator를 신경써줘야 할 수도 있기 때문에 웬만하면 erase를 적게 쓰는 방향으로 코드를 만들어야 좋다.