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



#include <string>
#include <vector>
#include <algorithm>
#include <cctype>
using namespace std;

string solution(string new_id) {
    string answer = "";
    
    // 1
    for (int i = 0; i < new_id.size(); i++) {
		new_id[i] = tolower(new_id[i]);
	}
    
    // 2
    vector<int> temp;
	for (int i = 0; i < new_id.size(); i++) {
		if ((new_id[i] != '.') && (new_id[i] != '-') && (new_id[i] != '_') && (isalpha(new_id[i])==0) && (isdigit(new_id[i])==0)) {
			temp.push_back(i);
		}
	}
	if (temp.size() != 0) {
		int index = 1;
		for (vector<int>::size_type i = 0; i < temp.size() - 1; i++) {
			new_id.erase(new_id.begin() + temp[i]);
			temp[i + 1] -= index++;
		}
		new_id.erase(new_id.begin() + *(temp.end() - 1));
	}
    
    // 3
    for(int i = 1; i < new_id.length(); ){
        if (new_id[i] == '.' && new_id[i - 1] == '.'){
            new_id.erase(new_id.begin() + i);
            continue;
        }
        else i++;
    }
    
    // 4
    if (*(new_id.begin()) == '.' ) {
		new_id.erase(new_id.begin());
	}
	if (new_id.size() != 0) {
		if (*(new_id.end() - 1) == '.') {
			new_id.erase(new_id.end() - 1);
		}
	}
    
    // 5
    if (new_id.size() == 0) {
		new_id += "a";
	}
    
    // 6
    if (new_id.size() >= 16) {
		new_id.erase(new_id.begin() + 15, new_id.end());
		if (*(new_id.end() - 1) == '.') {
			new_id.erase(new_id.end() - 1);
		}
	}
    
    // 7 
    if (new_id.size() <= 2) {
		char temp = *(new_id.end() - 1);
		while (new_id.size() < 3) {
			new_id += temp;
		}
	}
    answer+=new_id;
    return answer;
}

이번 문제는 문자열을 얼마나 내 마음대로 다룰 수 있는지가 중요한 것 같다.

새롭게 알게 된 함수는 다음과 같다. 헤더 파일은 <cctype>이다.

// tolower() : 대문자를 소문자로 바꿔주는 함수 // toupper() : 소문자를 대문자로 바꿔주는 함수 // isalpha() : 알파벳인지 확인해주는 함수 ( 대문자: 1, 소문자: 2, 알파벳이 아니면 0을 반환) // isdigit() : 숫자인지 판단하는 함수 (숫자면 true, 아니면 false 반환)

물론 나는 문제에서 주어진 조건을 하나하나 해결하면서 풀었지만 최적화는 아니다. 다음에 더 코드를 줄이는 방법을 생각해서 풀어봐야겠다.




© 2022. by KSC

Powered by sora