2021 KAKAO BLIND RECRUITMENT-신규 아이디 추천-C++

고동현·2024년 5월 17일
0

PS

목록 보기
28/51

C++로 문자열 처리를 하려니 정신이 나가버릴꺼 같았지만, 그래도 꿀팁을 깨닫게 된 문제였다.
문제바로가기

c++에서 문자열 처리에서 핵심은 일단 문자열로 로직을 처리하기보다는 deque로 옴겨서 문제를 푸는게 맞는거 같다.

일단 이 이유가 뭐냐면, string s = "dasdf"에서
a랑 f를 지우는 로직을 만들면
for(int i=0; i<s.size();i++){
if(s[i]=="a" 이거나 f이면){
s.erase(i);
}
}
이런식으로 해야되나 싶은데 문제가 뭐냐면 erase를 갈기면 s의size자체가 줄어들어서 for문을 할때 i와 s의 size를 조절을 해줘야하는점이다.

그래서 그냥 차라리 string을 deque로 넣은다음에 조건에 따라서 빼고 넣고 하는게 더 효율적인거 같다.

아스키코드
대문자 A가 65 소문자 a가 97이므로 차이가 32이다.
그래서 대문자를 소문자로 바꾸고 싶으면 32를 더하고
소문자를 대문자로 바꾸고싶으면 32를 빼면된다.

#include <string>
#include <vector>
#include <iostream>
#include <queue>
#include <deque>
using namespace std;

string solution(string new_id) {
    string answer ="";
    //1단계
    for(int i=0;i<new_id.size();i++){
        if('A'<=new_id[i] && new_id[i]<='Z'){
            new_id[i]+=32;
        }
    }
    
    //2단계
    queue <char> q;
    for(int i=0;i<new_id.size();i++){
        if('a'<=new_id[i] && new_id[i]<='z'){
            q.push(new_id[i]);
        }else if('0'<=new_id[i] && new_id[i]<='9'){
            q.push(new_id[i]);
        }else if (new_id[i] == '-'|| new_id[i] == '_' || new_id[i] == '.'){
            q.push(new_id[i]);
        }
    }
    
    //3단계
    int flag = 0;
    deque<char>t;
    while(!q.empty()){
        if(flag==0 && q.front()=='.'){
            flag = 1;
            t.push_back(q.front());
            q.pop();
        }else if(flag == 1 && q.front()=='.'){
            q.pop();
        }else{
            flag = 0; 
            t.push_back(q.front());
            q.pop();
        }
    }
    
    //4단계
    if(!t.empty() && t.front()=='.'){
        t.pop_front();
    }
    
    if(!t.empty() && t.back()=='.'){
        t.pop_back();
    }
    
    //5단계
    if(t.empty()){
        t.push_back('a');
    }
    
    deque<char>e;
    //6단계
    for(int i=0;i<t.size();i++){
        if(i>14){
            break;
        }
        e.push_back(t[i]);
    }
    
    if(e.back()=='.'){
        e.pop_back();
    }
   
    if(e.size()<=2){
        char tmp = e.back();
        while(e.size()!=3){
            e.push_back(tmp);
        }
    }
    
    for(int i=0;i<e.size();i++){
        answer+=e[i];
    }
    
    return answer;
}
profile
항상 Why?[왜썻는지] What?[이를 통해 무엇을 얻었는지 생각하겠습니다.]

0개의 댓글