본문 바로가기
코딩테스트/프로그래머스(lv1)

[프로그래머스 Level 1] 신규 아이디 추천 (C++)

by 볼링치는 개발자 2021. 1. 31.
반응형

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

 

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

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

programmers.co.kr

신규 아이디 추천 문제

구현 방법

 

0단계: 공백 제거

C++ STL의 remove(), erase() 함수를 통해 문자열에 원하는 값을 제거할 수 있습니다.

문자열. erase(remove(문자열. begin(), 문자열. end(), 제거하고 싶은 것), 문자열. end())

 

1단계: 소문자로 변환하기

문자열의 길이만큼 반복하며 소문자로 변환해주기 위해 tolower() 함수를 사용했습니다.

 

2단계: 알파벳 소문자, 숫자, "-", "_", "." 제외하고 제거

문자열의 길이만큼 반복하며 조건에 맞지 않는 문자는 NULL로 변경해주고, 마지막에 공백 제거한 방법으로 NULL을 제거해주었습니다.

 

3단계: 연속된 "." 하나의 "."으로 치환

람다식을 사용해 중복된 "."들 하나의 "."으로 치환했습니다

 

4단계: 처음이나 마지막에 위치한 "." 제거

첫 번째나 마지막 index에 "."이 위치하면 NULL로 바꿔주고 마지막에 NULL을 제거했습니다.

 

5단계: 빈 문자열이면 "a"대입

문자열이 비어있으면 "a" 넣어주었습니다.

 

6단계: 문자열이 16자 이상이면 15까지 자르고, 마지막에 "." 있으면 제거

substr 사용해 문자열 잘라주었습니다.

 

7단계: 문자열이 2자 이하라면 길이가 3이 될 때까지 마지막 단어 반복

문자열 길이가 3이 될 때까지 마지막 문제 반복해주었습니다.

 

위 로직은 아래 소스코드와 같이 구현했습니다.

 

소스코드

#include <bits/stdc++.h>
using namespace std;

string solution(string new_id) {
    string answer = "";

    //공백제거
    new_id.erase(remove(new_id.begin(), new_id.end(), ' '), new_id.end());

    //1단계: 소문자로 변환
    for(int i=0;i<new_id.length();i++) {
        new_id[i] = tolower(new_id[i]);
    }

    //2단계: 알파벳 소문자, '-','_','.' 제외하고 제거
    //조건 만족 못하면 NULL로 변경해주고 마지막에 NULL 부분 제거
    for(int i=0;i<new_id.length();i++) {
        if(!isalpha(new_id[i]) && !isdigit(new_id[i])) {
            if(new_id[i] != '-' &&  new_id[i] != '_' && new_id[i] != '.' ) {
                new_id[i] = NULL;
            } else {
                continue;
            }
        }
    }
    new_id.erase(remove(new_id.begin(), new_id.end(), NULL), new_id.end());

    //3단계: '.'가 연속되면 하나빼고 제거
    char c = '.';
    for(int i=0;i<new_id.length();i++) {
        new_id.erase(unique(new_id.begin(),new_id.end(),[=](const auto &c1, const auto &c2) {return c1 == c && c2 ==c;}),new_id.end());
    }

    //4단계: 앞뒤로 .가 위치하면 제거
    if(new_id[0] == '.')
        new_id[0] = NULL;
    if(new_id[new_id.length()-1] == '.')
        new_id[new_id.length()-1] = NULL;
    new_id.erase(remove(new_id.begin(), new_id.end(), NULL), new_id.end());

    //5단계: 문자열 비어있다면 a대입
    if(new_id.empty()) {
        new_id = "a";
    }

    //6단계: 문자열 크기가 15이상이면 자르기, . 로 끝난다면 제거
    if(new_id.length()>15) {
        new_id = new_id.substr(0,15);
    }
    if(new_id[new_id.length()-1] == '.')
        new_id[new_id.length()-1] = NULL;
    new_id.erase(remove(new_id.begin(), new_id.end(), NULL), new_id.end());

    //7단계: 문자열 길이가 2 이하면 3이 될때까지 마지막 문자 반복
    if(new_id.length()<3) {
        while(new_id.length()<3){
            new_id.append(&new_id[new_id.length()-1]);
        } 
    }

    answer=new_id;
    return answer;
}
반응형

댓글