본문 바로가기
Online-Judge/Programmers

[Programmers] C++ 신규 아이디 추천

by nyangzzi 2021. 9. 13.
반응형

https://programmers.co.kr/learn/courses/30/lessons/72410

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr


 

 

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

댓글