본문 바로가기
coding/algorithm

[programmers] Lv.1 신규 아이디 추천(c++)

by 눈부신음표 2022. 3. 1.
728x90
더보기
#include <string>
#include <vector>

using namespace std;

string solution(string new_id) {
    string answer = "";
    for(int i=0; i<new_id.length(); i++){
        new_id[i] = tolower(new_id[i]); // 대문자 소문자로 바꿔주기

        if(isalnum(new_id[i]) || new_id[i] == '-' || new_id[i] == '_'){
            answer += new_id[i]; // 알파벳, 숫자, -, _ 이면 answer에 넣음
            continue;
        }

        if(new_id[i] == '.' && answer.length() != 0 && answer.back() != '.')
            answer += new_id[i];  // .가 맨앞이거나 2번 이상 연속되면 answer에 넣지않음
    }
    if(answer.back() == '.') // .가 answer 마지막에 있으면 제거
        answer.pop_back();

    if(answer.length() == 0) // answer 길이가 0이면 "aaa" 리턴
        return "aaa";
    else if(answer.length() >= 16) // answer 길이가 16보다 크면 길이 15로 자름
        answer = answer.substr(0, 15);

    if(answer.back() == '.') // .가 answer 마지막에 있으면 제거
        answer.pop_back();

    while(answer.length() <= 2) // answer 길이가 2보다 작거나 같으면 마지막 글자를 길이가 3이 될때까지 추가
        answer += answer.back();

    return answer;
}

문제 정리:

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

 

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

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

programmers.co.kr

input

  • string new_id : 유저가 입력한 id

- 1단계 : 대문자는 모두 소문자로
- 2단계 : 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거
- 3단계 : 마침표(.)가 연속되지않게 하나만 남겨둠
- 4단계 : 마침표(.)가 처음이나 끝에 위치한다면 제거
- 5단계 : 4단계까지 마친 후 빈 문자열이라면, "a"를 대입합니다.
- 6단계 : 길이가 16자 이상이면, 첫 15개의 문자만 남김
            제거 후 마침표(.)가 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거
- 7단계 : 2자 이하라면, 마지막 문자를 길이가 3이 될 때까지 반복해서 끝에 붙임

output

  • 만들어진 새로운 추천 아이디를 리턴
728x90

[접근1]

new_id안에서 작업하려니 힘들어서 answer에 조건에 맞는 문자를 넣기로 했다.

new_id의 문자 하나하나를 도는데

    그 문자를 소문자로 바꿔준다

    그 문자가 알파벳이거나 숫자거나, '-'이거나, '_'이면 바로 answer에 넣고 

    그 문자가 '.'인데 answer가 비어있지않고('.'가 맨 앞에 안오게 하려고) answer의 마지막이 '.'이 아니면('.'가 연속되지 않게 하기 위해서) answer에 넣음

 

이렇게 만들어진 answer의 마지막에 '.'가 있다면 제거

 

string answer = "";
for(int i=0; i<new_id.length(); i++){
    new_id[i] = tolower(new_id[i]); // 대문자 소문자로 바꿔주기
        
    if(isalnum(new_id[i]) || new_id[i] == '-' || new_id[i] == '_'){ 
        answer += new_id[i]; // 알파벳, 숫자, -, _ 이면 answer에 넣음
        continue;
    }
    
    if(new_id[i] == '.' && answer.length() != 0 && answer.back() != '.') 
        answer += new_id[i];  // .가 맨앞이거나 2번 이상 연속되면 answer에 넣지않음
}

if(answer.back() == '.') // .가 answer 마지막에 있으면 제거
    answer.pop_back();

[접근2]

answer 길이가 0이면 "a"를 추가하는데, 나중에 어차피 answer의 길이가 2 이하면 길이가 3이 될때까지 맨 뒤의 문자를 추가하므로 바로 "aaa"를 return해줘도 된다.

 

answer 길이가 16이상이면 .substr을 이용해서 첫 15개의 문자만 남기고

이렇게 만들어진 answer의 마지막에 '.'가 있다면 제거

 

answer의 길이가 2보다 작거나 같으면 마지막 문자를 길이가 3이 될때까지 answer에 추가

 

if(answer.length() == 0) // answer 길이가 0이면 "aaa" 리턴
    return "aaa";
else if(answer.length() >= 16) // answer 길이가 16보다 크면 길이 15로 자름
    answer = answer.substr(0, 15);
    
if(answer.back() == '.') // .가 answer 마지막에 있으면 제거
    answer.pop_back();
    
while(answer.length() <= 2) // answer 길이가 2보다 작거나 같으면 마지막 글자를 길이가 3이 될때까지 추가
    answer += answer.back();
728x90

댓글