728x90
반응형

문제 풀이

문자열을 처리하는 방법에 대해서 알고 있다면 충분히 풀 수 있는 문제였다.

문자를 풀 수 있도록 순서대로 문제를 해결해 나가면 되기 때문에
문자열을 잘 다룰 수 있다면 쉽게 풀 수 있는 문제였다.

나는 정말 하드하게 문제를 그대로 해석해서 풀어보았다.
다른 언어를 통해 정규 표현식을 사용해 문자열을 제거해주는 방법을 사용하는 사람도 있었고
반복문을 더 간단하게 사용해서 보다 간결한 코드를 작성한 사람도 있었다.
다른 사람들의 코드를 보고 다른 방법으로도 풀어봐야겠다.

소스 코드

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

using namespace std;

string solution(string new_id) {
    string answer = "";
    
    // 1 단계 : 대문자 -> 소문자 변환
    transform(new_id.begin(), new_id.end(), new_id.begin(), ::tolower);
    cout << "1 : " << new_id << "\n";
    
    // 2 단계 : a-z,0-9,-,_,. 를 제외한 문자 제거
    for(int i=0; i<new_id.size(); i++) {
        if(islower(new_id[i]) || isdigit(new_id[i]) || new_id[i] == '-' || new_id[i] == '_' || new_id[i] == '.') {
            answer += new_id[i];
        }
    }
    cout << "2 : " << answer << "\n";
    
    // 3 단계 : 연속된 마침표(.) 제거
    for(int i=1; i<answer.size(); ) {
        if(answer[i] == '.' && answer[i-1] == '.') {
            answer.erase(answer.begin() + i);
            continue;
        } else {
            i++;
        }
    }
    cout << "3 : " << answer << "\n";
    
    // 4 단계 : 처음과 끝에 위치한 마침표(.) 제거
    if(answer.front() == '.') answer.erase(answer.begin());
    if(answer.back() == '.') answer.erase(answer.end()-1);
    cout << "4 : " << answer << "\n";
    
    // 5 단계 : 빈 문자열이면 a 를 대입
    if(answer.size() == 0) answer.push_back('a');
    cout << "5 : " << answer << "\n";
    
    // 6 단계 : 글자수가 16 이상이면 처음~15자를 제외한 나머지 문자 제거
    if(answer.size() > 15) {
        answer = answer.substr(0,15);
    }
    // 제거 후 마지막 글자가 마침표(.)가 되면 제거
    if(answer.back() == '.') answer.erase(answer.end()-1);
    cout << "6 : " << answer << "\n";
    
    // 7 단계 : 길이가 2자 이하면 마지막 문자를 3자리가 될 때까지 복사
    if(answer.size() < 3) {
        while(answer.size() != 3) {
            answer += answer.back();
        }
    }
    cout << "7 : " << answer << "\n";
    
    return answer;
}
728x90
반응형
복사했습니다!