[프로그래머스 Lv1] 신규 아이디 추천

수민이슈·2023년 5월 1일
0

[C++] 코딩테스트

목록 보기
27/116
post-thumbnail

🖊️ 문제

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

🖊️ 풀이

그냥 쭉 ~ 순서대로 구현하면 되는거였는데
C++ string 마스터해야 풀 수 있는 문제..?

C++ String 관련 함수들

  • erase하면 자동으로 인덱스를 땡겨주므로
    3단계에서 erase 안할 때만 i++을 해줘야 한다.
  • front() : str[str.begin()]
  • back() : str[str.end() - 1]
  • pop_back() : str.erase(str.end() - 1, str.end()) (맨 뒤 원소 삭제)

erase에서 인덱스 문제 관련으로 좀 애를 먹었다.

🖊️ 코드

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

using namespace std;

string solution(string new_id) {
    string answer = "";
    
    // 1단계
    for (auto& n : new_id) {
        if (isupper(n)) n = tolower(n);
    }
    
    // 2단계
    string temp = "";
    for (auto& n : new_id) {
        if (islower(n) || isdigit(n) || n == '-' || n == '_' || n == '.') {
            temp += n;
        }
    }
    new_id = temp;
    temp = "";
     
    // 3단계
    for (int i = 0 ; i < new_id.length() ; ) {
        if (new_id[i] == '.' && new_id[i-1] == '.') {
            new_id.erase(new_id.begin() + i);
        }
        else {
            i++;
        }
    }
    
    // 4단계
    if (new_id.front() == '.') new_id.erase(new_id.begin());
    if (new_id.back() == '.') new_id.erase(new_id.end() - 1, new_id.end());  
  
    // 5단계
    if(new_id.empty()) new_id = "a";
    
    // 6단계
    if (new_id.length() >= 16) new_id.erase(new_id.begin() + 15, new_id.end());
    if (new_id.back() == '.') new_id.erase(new_id.end()-1, new_id.end());

    // 7단계
    while(new_id.length() < 3) {
        new_id += (char)new_id.back();
    }
   
    answer = new_id;
    
    return answer;
}

0개의 댓글