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;
}