ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 신규아이디 추천
    프로그래머스(Programmers) 2021. 11. 9. 00:17
    반응형

    문제설명

     

     

     

     

     

     

    예를 들어, new_id 값이 "...!@BaT#*..y.abcdefghijklm" 라면, 위 7단계를 거치고 나면 new_id는 아래와 같이 변경됩니다.

    1단계 대문자 'B'와 'T'가 소문자 'b'와 't'로 바뀌었습니다.
    "...!@BaT#*..y.abcdefghijklm"  "...!@bat#*..y.abcdefghijklm"

    2단계 '!', '@', '#', '*' 문자가 제거되었습니다.
    "...!@bat#*..y.abcdefghijklm" → "...bat..y.abcdefghijklm"

    3단계 '...'와 '..' 가 '.'로 바뀌었습니다.
    "...bat..y.abcdefghijklm" → ".bat.y.abcdefghijklm"

    4단계 아이디의 처음에 위치한 '.'가 제거되었습니다.
    ".bat.y.abcdefghijklm" → "bat.y.abcdefghijklm"

    5단계 아이디가 빈 문자열이 아니므로 변화가 없습니다.
    "bat.y.abcdefghijklm"  "bat.y.abcdefghijklm"

    6단계 아이디의 길이가 16자 이상이므로, 처음 15자를 제외한 나머지 문자들이 제거되었습니다.
    "bat.y.abcdefghijklm"  "bat.y.abcdefghi"

    7단계 아이디의 길이가 2자 이하가 아니므로 변화가 없습니다.
    "bat.y.abcdefghi"  "bat.y.abcdefghi"

    따라서 신규 유저가 입력한 new_id가 "...!@BaT#*..y.abcdefghijklm"일 때, 네오의 프로그램이 추천하는 새로운 아이디는 "bat.y.abcdefghi" 입니다.

     

     

    [문제]

    신규 유저가 입력한 아이디를 나타내는 new_id가 매개변수로 주어질 때, "네오"가 설계한 7단계의 처리 과정을 거친 후의 추천 아이디를 return 하도록 solution 함수를 완성해 주세요.

    [제한사항]

    new_id는 길이 1 이상 1,000 이하인 문자열입니다.
    new_id는 알파벳 대문자, 알파벳 소문자, 숫자, 특수문자로 구성되어 있습니다.
    new_id에 나타날 수 있는 특수문자는 -_.~!@#$%^&*()=+[{]}:?,<>/ 로 한정됩니다.

     

     

    [입출력 예]

     

    예1 "...!@BaT#*..y.abcdefghijklm" "bat.y.abcdefghi"
    예2 "z-+.^." "z--"
    예3 "=.=" "aaa"
    예4 "123_.def" "123_.def"
    예5 "abcdefghijklmn.p" "abcdefghijklmn"

     

     

     

    #include <string>
    #include <vector>
    #include <iostream>
    
    using namespace std;
    bool check(char tmp)//false일 경우 들어갈 수 있는 문자가 아닌 것 
    {
        bool answer=false;
        if( (tmp >= 'a' && tmp <= 'z') || (tmp >='0' && tmp <= '9') || (tmp == '-' || tmp == '_' || tmp == '.') )
        {
            answer = true;
        }
        else answer = false;
        
        return answer;
    }
    
    
    string solution(string new_id) {
        string answer="";
        for(int i=0; i< new_id.length(); i++)
        {
            if(new_id[i] <='Z' && new_id[i] >='A')// 1단계
            {
                char tmp = (new_id[i] -'A' +'a');
                answer.push_back(tmp);
                continue;
            }
            if(!check(new_id[i]))//2단계
            {
                continue;
            }
    
           if(check(new_id[i]))//2단계
            {
               if(new_id[i] != '.')
                answer.push_back(new_id[i]);
            }
            if(new_id[i] == '.') //3단계
            {
                for(int j=i; j<new_id.length(); j++)
                {
                    if(new_id[j] == '.')
                    {
                        continue;
                    }
                    else
                    {
                     answer.push_back('.');
                     i = j-1; break;
                    }
                }
            }
        }
        
        for(int i=0; i<answer.length();)
        {
            if (answer[i] == '.' && answer[i - 1] == '.')
               {
                answer.erase(answer.begin() + i);
                continue;
                }
            else i++;
        }
        
        if(answer.front() == '.')   answer.erase(answer.begin());//4단계
        if(answer.back() == '.')   answer.erase(answer.end() -1);
                
        if(answer.length() >= 16)  answer = answer.substr(0,15); //6단계
        if(answer.back() == '.') answer.erase(answer.end() -1);//6단계-2
        
        if(answer.length() == 0) answer='a';// 5단계
        
        if(answer.length() <= 2)  while(answer.length() != 3) answer += answer.back();//7단계
            
        
        return answer;
    }

     

     

    => 문제에서 주어진대로 단계대로 정규식을 하면 되는 문제입니다. 

     

    => 단계대로 진행하다보면 "."과 "."이 붙어서 기대값과 실제 값이 다르게 나오는 경우가 있습니다. 

     

    => 해당 경우를 해결하기 위해 for문을 한번 더 사용하여서 알고리즘을 수정하였습니다. 

     

    => 위의 경우를 첫번째 for문에서 check 할 수 있는 방법이 있는지를 더 고민해봐야겠습니다. 

     

     

    반응형

    '프로그래머스(Programmers)' 카테고리의 다른 글

    카펫  (0) 2021.11.13
    소수만들기  (0) 2021.11.10
    최소직사각형  (0) 2021.10.14
    복서 정렬하기 C++  (0) 2021.10.07
    모음사전 C++  (0) 2021.10.07

    댓글

Designed by Who.