https://programmers.co.kr/learn/courses/30/lessons/72410
input으로 주어진 new_id를 조건에 맞춰 단계별로 변환해준다.
이때, 문자 하나하나 체크해줘야하는 1,2,3단계는 for문 안에, 전체 string을 체크하는 4,5,6,7 단계는 for문 밖에 작성하였다.
#include <string>
#include <vector>
using namespace std;
string solution(string new_id) {
string answer = new_id;
//단계별로 answer 변환
for(int i = 0; i<answer.size(); i++){
//1,2,3단계
}
//4,5,6,7단계
}
📌 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
if(answer[i] >= 'A' && answer[i] <= 'Z'){ //1단계
answer[i] = tolower(answer[i]); //tolower()함수로 쉽게 변환 가능
//함수를 사용하지 않을 시 아래처럼 작성 가능
//answer[i] = answer[i] - 'A' + 'a';
}
📌2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
- 만일 사용 가능한 문자가 아닐 경우 삭제한다. 이때, 문자를 삭제하게 되면 해당 인덱스에 다음 문자가 들어오며 전체 사이즈가 -1 된다.
따라서 for문의 i를 하나 줄여주어 다음 문자가 누락 되지 않고 체크 되도록 설정한다.
if( !((answer[i]>='a' && answer[i] <='z') || //2단계
(answer[i] >= '0' && answer[i] <= '9') ||
answer[i] == '-' || answer[i] == '_' || answer[i] == '.') ){
answer.erase(i,1); //문자 삭제 하여 전체 size가 -1 되었으므로
i--; //i로 인덱스 재설정
}
📌3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
- 현재 문자가 '.' 일 경우, 바로 전 문자 역시 '.' 였다면 해당 문자를 삭제해준다. 마찬가지로 for문의 i를 줄여주어 다음 문자가 누락되지 않도록 설정한다.
if(i != 0 && answer[i] == '.'){ //3단계
if(answer[i-1] == '.') {
answer.erase(i,1);
i--;
}
}
📌4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
//4단계
if(answer[0] == '.') answer.erase(0,1); //가장 앞 문자가 '.' 인 경우 삭제
if(answer[answer.size()-1] == '.') answer.erase(answer.size()-1,1); //가장 뒷 문자가 '.' 인 경우 삭제
📌5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
if(answer == "") answer = "a"; //5단계
📌6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
- 15번째 인덱스부터 모두 삭제해준다.
그 뒤, 마지막 인덱스 14가 '.' 라면 역시 삭제해준다.
if(answer.size() > 15) { //6단계
answer.erase(15, answer.size()-15);
if(answer[14] == '.') answer.erase(answer.size()-1,1);
}
📌6단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
- for문을 통해 마지막 문자를 반복하여 붙인다.
if(answer.size() < 3){ //7단계
char a = answer[answer.size()-1];
for(int i = answer.size(); i < 3; i++){
answer += a;
}
}
위의 과정을 통해 완성된 answer을 return 해준다.
return answer;
[전체 코드.cpp]
#include <string>
#include <vector>
using namespace std;
string solution(string new_id) {
string answer = new_id;
for(int i = 0; i<answer.size(); i++){
if(answer[i] >= 'A' && answer[i] <= 'Z'){ //1단계
answer[i] = tolower(answer[i]);
}
if( !((answer[i]>='a' && answer[i] <='z') || //2단계
(answer[i] >= '0' && answer[i] <= '9') ||
answer[i] == '-' || answer[i] == '_' || answer[i] == '.') ){
answer.erase(i,1);
i--;
}
if(i != 0 && answer[i] == '.'){ //3단계
if(answer[i-1] == '.') {
answer.erase(i,1);
i--;
}
}
}
if(answer[0] == '.') answer.erase(0,1); //4단계
if(answer[answer.size()-1] == '.') answer.erase(answer.size()-1,1);
if(answer == "") answer = "a"; //5단계
if(answer.size() > 15) { //6단계
answer.erase(15, answer.size()-15);
if(answer[14] == '.') answer.erase(answer.size()-1,1);
}
if(answer.size() < 3){ //7단계
char a = answer[answer.size()-1];
for(int i = answer.size(); i < 3; i++){
answer += a;
}
}
return answer;
}
'Online-Judge > Programmers' 카테고리의 다른 글
[Programmers] C++ 직사각형 별찍기 (0) | 2022.01.03 |
---|---|
[Programmers] JAVA 직사각형 별찍기 (0) | 2022.01.03 |
[Programmers] JAVA 2016년 (0) | 2022.01.02 |
[Programmers] Python 2016년 (0) | 2022.01.02 |
[Programmers] C++ 2016년 (0) | 2022.01.02 |
댓글