[ C++ ] 프로그래머스: 신규 아이디 추천
✏️ PS/Programmers

[ C++ ] 프로그래머스: 신규 아이디 추천

반응형

 

안녕하세요. 수구리입니다.

이번 포스팅에서는 2021 KAKAO BLIND RECRUITMENT에 나왔던 문제를 풀어보려고 합니다.

Level 1 문제이고, 기본 문자열 다루는 문제이지만 생각보다 조건이 많고 주어진 테스트 케이스 외에도

어떤 테스트케이스가 있는지 반례를 생각하면서 코딩을 했어야 했습니다.

그렇다면 아래 문제를 링크해두도록 하겠습니다.

 

 

 

[ 문제 ] 프로그래머스: 신규 아이디 추천

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

 

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

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

programmers.co.kr

 

 

[ 나의 풀이 ]

#include <string>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

string solution(string new_id) {
    string toDelete = "~!@#$%^&*()=+[{]}:?,<>/";
        
    // step 1
    transform(new_id.begin(), new_id.end(), new_id.begin(), ::tolower);
    
    // step 2
    for (size_t i=0; i<toDelete.length(); i++){
        for (size_t j=0; j<new_id.length(); j++){
            if( toDelete[i] == new_id[j]){
                new_id.erase(remove(new_id.begin(), new_id.end(), toDelete[i]), new_id.end());
            }
        }
    }
    // step 3
     for(int i = 1; i < new_id.length(); ){
        if (new_id[i] == '.' && new_id[i - 1] == '.'){
            new_id.erase(new_id.begin() + i);
            continue;
        }
        else i++;
    }
    
    // step 4
    if (new_id.front() == '.') new_id.erase(new_id.begin());
    if (new_id.back() == '.') new_id.erase(new_id.end() - 1);
    
    
    // step 5
    if (new_id.length() == 0){
        new_id = "a";
    }
    
    // step 6
    if (new_id.length() >= 16) {
        new_id.erase(15, new_id.length());
    }
    if (new_id.back() == '.') new_id.erase(new_id.end() - 1);
    
    // step 7
    if (new_id.length() <= 2) {
        while (new_id.length() != 3){
            new_id += new_id.back();
        }
    }
    
    return new_id;
}

문제에서 각 단계별로 진행한 결과를 리턴해야 하므로, 각 단계별 설명을 하겠습니다.

우선 들어가기 전, C++ 에는 String에 문자를 제거하는 erase 함수가 있습니다.

어떻게 사용하는지 간략하게 알아보겠습니다. 우선 String 헤더에 존재하고, 아래와 같은 형태입니다.

 

[ str.erase ]

string str = "0123456";

str.erase(2,4); // 2개의 인자를 넘긴 경우

cout << str << "\n"; // "016"

str.erase(1); // 1개의 인자를 넘긴 경우

cout << str; // "0"

위와 같이 사용할 수 있습니다.

우선, 1개의 인자를 넘기면서 호출한 경우는 해당 문자열에 index 값에 접근하여 그 문자를 삭제합니다.

다음으로 2개의 인자를 넘기면서 호출한 경우는 범위(시작, 끝)를 넘겼다는 것으로 인지하여,

첫번째 인자의 index에 대한 문자부터 시작하여 두 번째 인자의 수만큼 에 해당하는 문자를 지웁니다.

위의 예시에서 인자를 2개 넘겼을 때를 보겠습니다.

0 1 2 3 4 5 6

위의 배열이 str 문자열 배열입니다.

그러면 첫 번째 인자가 2이므로 배열 내의 문자 "2" 부터 

두 번째 인자인 4이므로 4개를 지울 건데..

2, 3, 4, 5가 지워지는 것입니다..! 그래서 결과가 016이 찍히는 것이죠.

 

[ 설명 ]

1. 신규 아이디에서 제거해야 할 문자열 선언.

2. 입력받은 문자열을 lower case (소문자로) 변환

3. 제거해야하는 문자열을 하나씩 순회하면서 new_id에 존재하면 제거

4. new_id를 순회하는데 index를 1부터 시작하고, 이전 index와 비교하여 만약 연달아 ". " 가 나올 경우에는 하나로 합쳐준다.

5. new_id에서 첫 번째와 마지막 문자는 " . "을 제거해주도록 한다. (여기서 if와 else로 쓰지 않도록 주의)

6. 만약 길이가 "0" 이라면 문자 "a"하나를 붙여준다. (step 7단계를 위한 작업)

7. 만약 길이가 "16" 이상이라면 15 문자만 남기도록 하기 위해서 15번째 (new_id는 0부터 시작하므로..) 부터 끝까지는 제거하도록 한다. 여기서 만약에 끝부분에 ". "이 남을 수도 있으므로 있다면 제거.

8. 만약 new_id의 길이가 2 이하라면 길이가 3이 될 때까지 반복하면서 new_id의 맨 마지막 문자를 붙여준다.

9. 모든 단계를 마쳤으면 new_id에는 모든 조건을 만족하는 새로운 아이디가 있으므로 반환한다.

 

이상입니다. 감사합니다!

 

 

반응형