(코딩테스트)신규아이디 추천
2022. 6. 30. 02:03ㆍ개발자 과정/C,C++
1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
그냥 여기에 나와있는 그대로 따라 만들어 주면 된다.
실력있는 분은 이 코드를 엄청 압축시켜 놨던데, 로직자체는 변함이 없다. 정말 그냥 시키는 대로 만들면 되는 문제라..
다만, 예외에 각별히 신경을 쓰는게 좋겠다. 난 메모리 예외가 나왔는데, 찾느라 시간이 좀 걸렸다...
class ChManager {
//class를 썼다. 조건에 맞춰 이리저리 밑그림을 그려보는데,
이게 함수로 나눠도 되게 지저분 할 거 같아서 스스로 정돈하며
코드를 작성할 겸, 객체지향의 꽃은 객체를 만들때다! 싶은 생각도 할겸
class를 사용했다.//
string new_id;
public:
ChManager(string new_id) {
this->new_id = new_id;//생성자//
}
void ch1() {
string answer = "";
for (int i = 0; i < new_id.length(); i++) {
answer += tolower(new_id[i]);
}
new_id = answer;
}//대문자를 소문자로 바꾼다.//
void ch2() {
string answer = "";
for (int i = 0; i < new_id.length(); i++) {
if (new_id[i] == '-' || new_id[i] == '.' || new_id[i] == '_' || islower(new_id[i])||isdigit(new_id[i])) {
answer += new_id[i];
}
}
new_id = answer;
}//조건에 맞는 문자로 거른다.//
void ch3() {
string answer = "";
for (int i = 0; i < new_id.length(); i++) {
if (new_id[i] == '.') {
if (new_id[i+1] == new_id[i]) {
continue;
}
else answer += new_id[i];
}
else answer += new_id[i];
}
new_id = answer;
}//중복된'.'문자를 통일시킨다.//
void ch4() {
string answer = "";
int i = 0;
while ((new_id[i] == '.' || new_id.back() == '.'))
{
//왜 while을 썼지...?내가 생각해도 이상하다..
아무튼 실행시간도 문제없으니...//
if (new_id[i] == '.') {
i++;
}
if (new_id.back() == '.') {
new_id.pop_back();
}
ch5();//문자열이 비는지 확인하는 함수다.
'.'만 있는데 pop할 경우를 대비한다.
그렇지 않으면 메모리 오류가 난다.//
}
answer = new_id.substr(i);
new_id = answer;
//알맞게 다시 문자열을 정리한다.//
}
void ch5() {
if (new_id.empty()) {
new_id = 'a';
}
}//문자열이 비었는지 확인한다.//
void ch6() {
if (new_id.length() > 15) {//문자열이 15문자를 넘으면//
string answer = new_id.substr(0, 15);//15개 까지 자른다.//
new_id = answer;
if (new_id.back() == '.') {
//15개로 잘랐을때 맨 뒤에 '.'이 있으면//
new_id.pop_back();//pop한다.//
}
}
}
void ch7() {
while (new_id.length() <= 2)
{
new_id.push_back(new_id.back());
}//문자열이 2문자 이하면 3문자가 될 때 까지
맨 뒤의 문자를 복사해 붙여넣는다.//
}
string callid() {
return new_id;
}//결과 리턴//
};
괜히 객체로 만들려 했던거 같다...노가다 했다 끄아아아악
'개발자 과정 > C,C++' 카테고리의 다른 글
(코딩테스트)크레인 인형뽑기 게임 (0) | 2022.07.03 |
---|---|
(코딩테스트)키패드누르기 (0) | 2022.07.02 |
(코딩테스트)로또의 최고순위와 최저순위 (0) | 2022.06.29 |
(코딩테스트) 신고결과 받기 (0) | 2022.06.27 |
(코딩테스트)문자열 압축 (0) | 2022.06.21 |