[프로그래머스/C++] ㅡ LV1 - 신규 아이디 추천

2021. 2. 23. 17:00필요/코딩테스트(프로그래머스)

문제

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

 

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

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

programmers.co.kr

풀이

#include <string>
#include <vector>

using namespace std;

string solution(string new_id) {
    for (int i=0; i<new_id.size(); i++) {	// 1단계 적용
        if (new_id[i]>=65 && new_id[i]<=90) {
            new_id[i]+=32;
        }
    }
    
    string next_id = "";
    for (int i=0; i<new_id.size(); i++) {	// 2단계 적용
        if ((new_id[i]>=97 && new_id[i]<=122)||(new_id[i]>=48 && new_id[i]<=57) || new_id[i]=='-' || new_id[i]=='_' || new_id[i]=='.') {
            next_id+=new_id[i];
        }
    }
    
    new_id.clear();
    for (int i=0; i<next_id.size(); i++) {	// 3단계 적용
        if (next_id[i]=='.') {
            if (next_id[i]!=next_id[i-1]) {
                new_id+=next_id[i];
            }
        }
        else {
            new_id+=next_id[i];
        }
    }
    
    if (new_id[0] == '.') new_id.erase(0, 1);	// 4단계 적용
    if (new_id[new_id.size()-1] == '.') new_id.erase(new_id.size()-1, 1);
    
    if (new_id.empty()) new_id+='a';	// 5단계 적용
    
    if (new_id.size() >= 16) new_id.erase(15);	// 6단계 적용
    if (new_id[new_id.size()-1] == '.') new_id.erase(new_id.size()-1, 1);

    
    for (int i=new_id.size()-1; i<2; i++)	// 7단계 적용
        new_id+=new_id[i];
    
    return new_id;
}

개념

C++의 string에 관한 문법을 많이 사용한다.

 

추가

+=를 사용해서 문자열 추가 또는 문자 수정이 가능하다.

 

next_id+=new_id[i];

값은 next_id의 끝부분에 추가된다.

 

new_id[i]+=32;

문자열 new_id의 인덱스에 해당하는 값(문자)에 + 32가 된다.

 

삭제

다음 두 식을 구분할 수 있어야 한다.

new_id.erase(0, 1)

이는 0번째 인자부터 1개의 문자열을 제거하는 뜻이다.

 

new_id.erase(0)

이는 0번째 인자부터 문자열 끝까지 제거한다.

 

기타

new_id.size()

문자열의 길이를 나타낸다.(배열의 인자처럼 사용하려면 -1을 해야한다)

 

new_id.clear()

들어 있는 문자열을 비운다.

 

new_id.empty()

문자열이 텅빈 경우 true를 반환한다.

 


풀이

주어진 7단계 순서대로 문제를 해결했다.

몇 개의 단계를 묶으면 좀 더 간단해 질 것 같으나, 반드시 선행되어야 하는 부분이 있었다.

 

step1

일단 문자열의 요소가 대문자인 경우를 if문으로 받아서 +32를 해서 소문자로 바꾼다.

 

step2

문자열 요소가 소문자 or 숫자 or ' . ' or ' _ ' or ' - ' 인 경우, 새로운 문자열 next_id에 대입한다.

 

step3

new_id를 clear한다.

next_id를 탐색하며 요소가 ' . ' 이며 이전 요소도 ' . '이 아니라면 new_id에 대입한다.

애초에 ' . '이 아니여도 new_id 에 대입한다.

 

step4

첫번째 index와 마지막 index가 각각 ' . ' 일 때 erase한다.

 

step5

문자열이 텅빈 경우 문자 a를 추가한다.

 

step6

문자열이 16보다 길 때, erase(15)를 사용해서 뒷부분을 모두 제거한다.

그리고 step4와 동일하게 마지막 index가 ' . ' 일 때 erase한다.

 

step7

문자열의 길이가 3보다 작을 때, 마지막번째의 문자를 문자열을 더 추가한다.

반복문 전에 if를 사용하지 않는 것은, for문 안의 반복에도 조건이 있기 때문이다.