프로그래머스의 신규 아이디 추천(Lv1) 문제이다.


[ 문제풀이 ]

문제에서 제시한 7단계의 조건에 맞게 주어진 아이디를 규칙에 맞는 새로운 아이디로 만들어야 하는 문제이다.

7단계로 제시되어 있으니 각 단계별로 알아보자.


#1 & 2단계 : 대문자를 소문자로 바꾸고, 올바른 문자만 남기기

1단계는 주어진 아이디의 대문자들을 모두 소문자로 바꿔주어야 한다.

본인은 이 과정에서 'tolower()' 함수를 통해서 대문자를 소문자로 바꾸는 과정을 진행해 주었다.

2단계는 문제에서 제시한 문자들만 아이디에 남도록 만들어 주어야 한다.

따라서, 본인은 새로운 문자열 변수를 생성한 후, 문제에서 제시한 문자들만 새로운 문자열에 추가시키면서

새로운 문자열을 만들어 주었다.

코드로 확인하면 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
void Stage_OneAndTwo(string &Str)
{
    string Result = "";
    for (int i = 0; i < Str.length(); i++)
    {
        char C = Str[i];
        if ('A' <= C && C <= 'Z') Result += tolower(C);
        else if (('a' <= C && C <= 'z'|| ('0' <= C && C <= '9'|| C == '-' || C == '_' || C == '.') Result += C;
    }
    Str = Result;
}
cs

기존의 아이디가 매개변수인 'Str'이고, 1단계와 2단계를 통해서 만들어진 새로운 아이디가 Result 이다.

조건에 맞는 문자들만 Result에 추가하면서 새로운 아이디를 만드는 과정이다.


# 3단계 : '.'이 2번 이상 연속된 부분을 하나의 '.'으로 치환하기

3단계는 2개 이상 연속된 '.'이 나올 경우 하나의 '.'으로 바꿔주어야 하는 단계이다.

주어진 말 그대로 구현만 하면 되기 때문에 별다른 설명보다는 코드로 대체하겠다.

본인은 다음과 같이 구현하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Stage_Three(string &Str)
{
    if (Str.length() < 2return;
    string Result = "";
    int Idx = 0;
    while (Idx < Str.length())
    {
        if (Idx + 1 < Str.length() && (Str[Idx] == '.' && Str[Idx + 1== '.'))
        {
            while (Idx < Str.length() && Str[Idx] == '.') Idx++;
            Result += '.';
        }
        else Result += Str[Idx++];
    }
    Str = Result;
}
cs

1,2단계와 마찬가지로 1 , 2단계를 거친 현재까지 만들어진 새로운 아이디가 'Str' 변수이고(매개변수)

line4)에 선언된 'Result'라는 변수가 조건에 맞게 새로 생성한 ID를 저장하는 변수이다.

line8)에서 보면, '.'이 2번 이상 연속된 구간을 찾는 조건문이 설정되어 있다.

만약 이런 구간을 찾게 된다면, 연속된 모든 '.'들을 탐색해야 하기 때문에 line10)에서 while문을 통해서 연속된 모든 '.'들을

찾는 과정을 구현하였다. 최종적으로는 line11)에서 문자열에는 '.' 하나만 추가하는 것을 볼 수 있따.

즉, 연속된 '.'들을 모두 없애고 하나의 '.'만 추가함으로써 3단계를 구현하였다.


# 4단계 : 가장 처음와 끝에 존재하는 '.' 삭제하기

# 5단계 : 현재 아이디가 빈 문자열이라면 , 문자 'a' 추가하기.

위의 2개의 단계는 너무 간단한 과정이므로 코드로 대체하겠다.

1
2
3
4
5
6
7
8
9
10
11
void Stage_Four(string &Str)
{
    if (Str.length() == 0return;
    if (Str[0== '.') Str = Str.substr(1);
    if (Str.length() >= 1 && Str[Str.length() - 1== '.') Str = Str.substr(0, Str.length() - 1);
}
 
void Stage_Five(string &Str)
{
    if (Str.length() == 0) Str = "a";
}
cs


# 6단계 : 문자열의 길이를 15로 맞추기

문자열의 길이가 16이상인 경우, 길이가 15인 문자열로 만들어 주어야 한다.

이 과정까지는 크게 문제가 없지만, 만약 이렇게 문자들을 제거한 후, '.'이 가장 마지막에 존재한다면 4단계의 과정처럼

'.'을 삭제해주어야 한다.

따라서, 본인은 주어진 문자열을 길이가 15인 문자열로 짜른 후에, #4단계에서 구현해 놓은 Stage_Four함수를 호출해줌으로써

이를 구현하였다.

1
2
3
4
5
6
void Stage_Six(string &Str)
{
    if (Str.length() < 16return;
    Str = Str.substr(015);
    Stage_Four(Str);
}
cs


# 7단계 : 길이를 3인 문자열로 만들기

이 또한 간단한 과정이므로 코드로 대체하겠다.

1
2
3
4
5
6
void Stage_Seven(string &Str)
{
    if (Str.length() >= 3return;
    char C = Str[Str.length() - 1];
    while (Str.length() < 3) Str += C;
}
cs


[ 소스코드 ]

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <string>
#include <vector>
 
using namespace std;
 
void Stage_OneAndTwo(string &Str)
{
    string Result = "";
    for (int i = 0; i < Str.length(); i++)
    {
        char C = Str[i];
        if ('A' <= C && C <= 'Z') Result += tolower(C);
        else if (('a' <= C && C <= 'z'|| ('0' <= C && C <= '9'|| C == '-' || C == '_' || C == '.') Result += C;
    }
    Str = Result;
}
 
void Stage_Three(string &Str)
{
    if (Str.length() < 2return;
    string Result = "";
    int Idx = 0;
    while (Idx < Str.length())
    {
        if (Idx + 1 < Str.length() && (Str[Idx] == '.' && Str[Idx + 1== '.'))
        {
            while (Idx < Str.length() && Str[Idx] == '.') Idx++;
            Result += '.';
        }
        else Result += Str[Idx++];
    }
    Str = Result;
}
 
void Stage_Four(string &Str)
{
    if (Str.length() == 0return;
    if (Str[0== '.') Str = Str.substr(1);
    if (Str.length() >= 1 && Str[Str.length() - 1== '.') Str = Str.substr(0, Str.length() - 1);
}
 
void Stage_Five(string &Str)
{
    if (Str.length() == 0) Str = "a";
}
 
void Stage_Six(string &Str)
{
    if (Str.length() < 16return;
    Str = Str.substr(015);
    Stage_Four(Str);
}
 
void Stage_Seven(string &Str)
{
    if (Str.length() >= 3return;
    char C = Str[Str.length() - 1];
    while (Str.length() < 3) Str += C;
}
 
string solution(string new_id) 
{
    string answer = new_id;
    Stage_OneAndTwo(answer);
    Stage_Three(answer);
    Stage_Four(answer);
    Stage_Five(answer);
    Stage_Six(answer);
    Stage_Seven(answer);
    return answer;
}
 
cs






+ Recent posts