-
신규아이디 추천프로그래머스(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