2 분 소요

Question

Q Q2 Q3 Q4


Solution

  • 각 7단계를 while과 switch문으로 차례대로 거쳐가도록 만들었다.
  • 중간 요소를 제거할때 라이브러리에 있는 함수를 쓰는게 보통이지만 이번에는 연습한다고 사용하지 않았다.
    그래서 요소 제거시 뒤에 있는 원소들을 한 칸씩 앞으로 땡겨주고 size도 줄여줘야 한다.

  • 추가: erase()를 사용하면 size도 같이 조절 해주기 때문에 이 처럼 코드가 복잡하진 않을 것이다.
    while과 switch문 때문에 오히려 가독성이 떨어지는 것 같아 없애고 if문으로 대체해도 괜찮을지 싶다.

Cord

#include <iostream>
#include <string>
#include <vector>

using namespace std;

string solution(string new_id) 
{
    string answer = "";
    string temp;
    temp = new_id;
    char prev = '0';

    // 7단계 진행
    int phase = 1;
    int size = temp.size();
    while (phase < 8)
    {
        switch (phase)
        {
            case 1: // 대문자를 소문자로 치환
                for (int i = 0; i < size; i++)
                {
                    if (isupper(temp[i]))
                    {
                        temp[i] += 32;
                    }
                }
                break;
            case 2: // 숫자, 소문자, 대문자 '-', '_', '.'를 제외한 나머지 제거
                for (int i = 0; i < size; i++)
                {
                    if ((temp[i] >= '0' && temp[i] <= '9') || isalpha(temp[i]) ||
                        temp[i] == '-' || temp[i] == '_' || temp[i] == '.')
                    {
                        continue;
                    }
                    else
                    {
                        // 제거 후 인덱스 한 칸씩 당기기
                        for (int k = i; k < size; k++)
                        {
                            temp[k] = temp[k + 1];
                        }
                        size--;
                        i--;
                    }
                }
                break;
            case 3: // 연속된 마침표'.'를 하나로 치환
                for (int i = 0; i < size; i++)
                {
                    if (prev == '.' && temp[i] == '.')
                    {
                        // 제거 후 인덱스 한 칸씩 당기기
                        for (int k = i; k < size; k++)
                        {
                            temp[k] = temp[k + 1];
                        }
                        size--;
                        i--;
                    }

                    prev = temp[i];
                }
                break;
            case 4: // 처음과 끝이 '.'이라면 제거
                // 처음에 있으면
                if (temp[0] == '.')
                {
                    // 제거 후 인덱스 한 칸씩 당기기
                    for (int k = 0; k < size; k++)
                    {
                        temp[k] = temp[k + 1];
                    }
                    size--;
                }
                // 마지막에 있으면
                if (temp[size - 1] == '.') { size--; }
                break;
            case 5: // 빈 문자열이면 'a' 대입
                if (size == 0) { temp[0] = 'a'; size++; }
                break;
            case 6: // 길이 16자 이상 제한
                if (size > 15) { size = 15; }
                // 사이즈 제한 후 마지막이 '.' 이라면 제거
                if (temp[size - 1] == '.') { size--; }
                break;
            case 7:
                if (size <= 2)
                {
                    for (int i = size; i < 3; i++)
                    {
                        temp[i] = temp[size - 1];
                        size++;
                    }
                }
                break;
        }

        phase++;
    }

    // 쓰레기값을 제외한 나머지를 answer에 옮기기
    for (int i = 0; i < size; i++)
    {
        answer += temp[i];
    }
    return answer;
}

int main()
{
    string st = "...!@BaT#*..y.abcdefghijklm";

    st = solution(st);

    for (int i = 0; i < st.size(); i++)
    {
        cout << st[i];
    }

    return 0;
}

Result

Result