신규 아이디 추천

eunheelog·2023년 6월 1일
0

programmers

목록 보기
1/15

프로그래머스 - 신규 아이디 추천

문제 요약


[ 카카오 아이디 규칙 ]

  • 3 ≤ 아이디 길이 ≤ 15
  • 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 문자만 가능
  • 마침표(.)는 처음과 끝에 사용 X, 연속 사용 X

신규 유저가 입력한 아이디가 new_id라면,
1단계) new_id의 모든 대문자 → 소문자 변경
2단계) 규칙에 어긋나는 문자 제거
3단계) 연속된 마침표를 하나로 !
4단계) 처음과 끝에 있는 마침표 제거
5단계) new_id가 빈 문자열 → "a" 대입
6단계) new_id길이 ≥ 16 이면 처음부터 15자만 남김 (.으로 끝나면 .제거)
7단계) new_id길이 ≤ 2 이면 마지막 문자를 길이가 3이 될 때까지 반복 !

💡Idea

  1. 모든 대문자를 소문자로 변경하면서 규칙에 어긋나는 문자를 제거할 수 없을까?
    (new_id에서 문자를 제거해서 new_id에 저장하기보단 answer에 저장하자 !)
    ① new_id 길이만큼 반복하면서 알파벳이라면 무조건 소문자로 저장
    isalpha() 로 알파벳인지 확인 후 tolower() 로 저장
    ② 규칙에 어긋나는 문자는 저장하지 말기 ! → 제거하는 것과 같음

  2. 연속된 마침표를 찾아서 하나로 바꾸는 방법?
    → answer에 ".."가 존재하는 동안 replace 를 사용하여 "."로 바꿔주기 !

Source Code

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

using namespace std;

string solution(string new_id) {
    string answer = "";
    for(int i=0; i<new_id.length(); i++) {
        if(isalpha(new_id[i])) { // 영어라면
            answer += tolower(new_id[i]); // 소문자로 바꿔주기
        }
        else if(isdigit(new_id[i]) || new_id[i] == '-' || new_id[i] == '_' || new_id[i] == '.') {
            answer += new_id[i];
        }
    }
   
    while(answer.find("..") != string::npos) { // 연속된 마침표 제거
        answer.replace(answer.find(".."), 2, ".");
    }
   
    if(answer[0] == '.') { // 마침표가 처음에 위치하면
        answer = answer.substr(1); // 제거
    }
  
    if(answer[answer.length()-1] == '.') { // 마침표가 끝에 위치하면
        answer = answer.substr(0, answer.length() - 1); // 제거
    }
   
    if(answer == "") {
        answer = "a";
    }
   
    if(answer.length() >= 16) {
        answer = answer.substr(0, 15);
        if(answer[answer.length() - 1] == '.') {
            answer = answer.substr(0, answer.length() - 1);
        }
    }
   
    if(answer.length() <= 2) {
        while(answer.length() < 3) {
            answer += answer[answer.length() - 1];
        }
    }
   
    return answer;
}

Feedback


  1. 규칙에 어긋나는 문자를 제거해서 new_id에 바로 저장하려고 하다보니 복잡했다.
    → 나중엔 쉬운 방법을 찾았지만 계속해서 간단한 방법을 생각하는 연습하기 !

  2. string 함수 중 replace 인자 값들이 헷갈려서 찾아보았음.
    → 검색하지 않고 사용할 수 있게 하기 !

Remind


  • replace(바꿀 문자열 시작 위치, 문자열 길이, 교체할 문자열)
profile
⛧1일 1알고리즘⛧

0개의 댓글