반응형
programmers.co.kr/learn/courses/30/lessons/72410
구현 방법
0단계: 공백 제거
C++ STL의 remove(), erase() 함수를 통해 문자열에 원하는 값을 제거할 수 있습니다.
문자열. erase(remove(문자열. begin(), 문자열. end(), 제거하고 싶은 것), 문자열. end())
1단계: 소문자로 변환하기
문자열의 길이만큼 반복하며 소문자로 변환해주기 위해 tolower() 함수를 사용했습니다.
2단계: 알파벳 소문자, 숫자, "-", "_", "." 제외하고 제거
문자열의 길이만큼 반복하며 조건에 맞지 않는 문자는 NULL로 변경해주고, 마지막에 공백 제거한 방법으로 NULL을 제거해주었습니다.
3단계: 연속된 "." 하나의 "."으로 치환
람다식을 사용해 중복된 "."들 하나의 "."으로 치환했습니다
4단계: 처음이나 마지막에 위치한 "." 제거
첫 번째나 마지막 index에 "."이 위치하면 NULL로 바꿔주고 마지막에 NULL을 제거했습니다.
5단계: 빈 문자열이면 "a"대입
문자열이 비어있으면 "a" 넣어주었습니다.
6단계: 문자열이 16자 이상이면 15까지 자르고, 마지막에 "." 있으면 제거
substr 사용해 문자열 잘라주었습니다.
7단계: 문자열이 2자 이하라면 길이가 3이 될 때까지 마지막 단어 반복
문자열 길이가 3이 될 때까지 마지막 문제 반복해주었습니다.
위 로직은 아래 소스코드와 같이 구현했습니다.
소스코드
#include <bits/stdc++.h>
using namespace std;
string solution(string new_id) {
string answer = "";
//공백제거
new_id.erase(remove(new_id.begin(), new_id.end(), ' '), new_id.end());
//1단계: 소문자로 변환
for(int i=0;i<new_id.length();i++) {
new_id[i] = tolower(new_id[i]);
}
//2단계: 알파벳 소문자, '-','_','.' 제외하고 제거
//조건 만족 못하면 NULL로 변경해주고 마지막에 NULL 부분 제거
for(int i=0;i<new_id.length();i++) {
if(!isalpha(new_id[i]) && !isdigit(new_id[i])) {
if(new_id[i] != '-' && new_id[i] != '_' && new_id[i] != '.' ) {
new_id[i] = NULL;
} else {
continue;
}
}
}
new_id.erase(remove(new_id.begin(), new_id.end(), NULL), new_id.end());
//3단계: '.'가 연속되면 하나빼고 제거
char c = '.';
for(int i=0;i<new_id.length();i++) {
new_id.erase(unique(new_id.begin(),new_id.end(),[=](const auto &c1, const auto &c2) {return c1 == c && c2 ==c;}),new_id.end());
}
//4단계: 앞뒤로 .가 위치하면 제거
if(new_id[0] == '.')
new_id[0] = NULL;
if(new_id[new_id.length()-1] == '.')
new_id[new_id.length()-1] = NULL;
new_id.erase(remove(new_id.begin(), new_id.end(), NULL), new_id.end());
//5단계: 문자열 비어있다면 a대입
if(new_id.empty()) {
new_id = "a";
}
//6단계: 문자열 크기가 15이상이면 자르기, . 로 끝난다면 제거
if(new_id.length()>15) {
new_id = new_id.substr(0,15);
}
if(new_id[new_id.length()-1] == '.')
new_id[new_id.length()-1] = NULL;
new_id.erase(remove(new_id.begin(), new_id.end(), NULL), new_id.end());
//7단계: 문자열 길이가 2 이하면 3이 될때까지 마지막 문자 반복
if(new_id.length()<3) {
while(new_id.length()<3){
new_id.append(&new_id[new_id.length()-1]);
}
}
answer=new_id;
return answer;
}
반응형
'코딩테스트 > 프로그래머스(lv1)' 카테고리의 다른 글
[프로그래머스 Level 1] 키패드 누르기 (C++) (0) | 2021.02.28 |
---|---|
[프로그래머스 Level 1] 직사각형 별찍기 (C++ - 2가지) (0) | 2021.01.30 |
[프로그래머스 Level 1] 다트 게임 (C++) (0) | 2021.01.30 |
[프로그래머스 Level 1] 비밀 지도 (C++) (0) | 2021.01.30 |
[프로그래머스 Level 1] 실패율 (C++) (0) | 2021.01.30 |
댓글