반응형
#INFO
문제 : 신규 아이디 추천
난이도 : LEVEL1
출처 : 2021 KAKAO BLIND RECRUITMENT
코딩테스트 연습 - 신규 아이디 추천 | 프로그래머스 (programmers.co.kr)
#SOLVE
해당 언어의 문자열 관련 함수에 대해 잘 알고 있으면 쉽게 풀이할 수 있는 문제였다.
문제에서 제시한 조건대로 차근차근 따라가면 어렵지 않게 풀어나갈 수 있지만,,,,
2단계와 3단계 처리에서 조금 애를 먹었다.
// 2 단계 : new_id에서 "알파벳 소문자", "숫자", "빼기(-)", "밑줄(_)", "마침표(.)"
// 를 제외한 모든 문자를 제거 _ islower, isdigit
for(int i = 0; i < new_id.length(); ) {
if (islower(new_id[i]) || isdigit(new_id[i])
|| new_id[i] == '-' || new_id[i] == '_' || new_id[i] == '.'){
i++;
continue;
}
new_id.erase(new_id.begin() + i);
}
// 3 단계 : 마침표(.)가 2번 이상 연속되면 하나의 마침표(.)로 치환
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++;
}
string 라이브러리의 erase 함수는 문자열의 특정 위치의 문자를 제거하고 자동으로 뒤에 있는 문자열을 앞으로 땡겨주기 때문에, 인덱스 i의 값을 증가시켜줄 필요가 없다.
이 부분만 조심하면 나머지는 크게 어렵지 않았던 것 같다.
#CODE
#include <string>
#include <vector>
#include <cctype>
using namespace std;
string solution(string new_id) {
// 1 단계 : new_id의 모든 대문자를 소문자로 치환 _ isupper, tolower
for(int i = 0; i < new_id.length(); i++)
if (isupper(new_id[i]))
new_id[i] = tolower(new_id[i]);
// 2 단계 : new_id에서 "알파벳 소문자", "숫자", "빼기(-)", "밑줄(_)", "마침표(.)"
// 를 제외한 모든 문자를 제거 _ islower, isdigit
for(int i = 0; i < new_id.length(); ) {
if (islower(new_id[i]) || isdigit(new_id[i])
|| new_id[i] == '-' || new_id[i] == '_' || new_id[i] == '.'){
i++;
continue;
}
new_id.erase(new_id.begin() + i);
}
// 3 단계 : 마침표(.)가 2번 이상 연속되면 하나의 마침표(.)로 치환
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.front() == '.') new_id.erase(new_id.begin());
if (new_id.back() == '.') new_id.erase(new_id.end() - 1);
// 5 단계 : new_id가 빈 문자열이면, "a"를 대입
if (new_id.length() == 0)
new_id = "a";
// 6 단계 : new_id의 길이가 16 이상이면, 첫 15개 문자를 제외한 나머지 문자 제거
if (new_id.length() >= 16){
while(new_id.length() != 15){
new_id.erase(new_id.begin() + 15);
}
}
if (new_id.back() == '.') new_id.erase(new_id.end() - 1);
// 7 단계 : new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id 길이가 3이 될 때 까지 반복
if (new_id.length() <= 2){
while(new_id.length() != 3){
new_id += new_id.back();
}
}
return new_id;
}
반응형
'Archive2 > ProblemSolving' 카테고리의 다른 글
[BOJ] C++ 11651 "좌표 정렬하기 2" 문제 풀이 _ nov (0) | 2022.06.07 |
---|---|
[BOJ] C++ 11650 "좌표 정렬하기" 문제 풀이 _ nov (0) | 2022.06.07 |
[프로그래머스] LEVEL1 : 신고 결과 받기 C++ (0) | 2022.05.31 |
[프로그래머스] LEVEL1 : 같은 숫자는 싫어 C++ _ 미완 (0) | 2022.05.24 |
[프로그래머스] LEVEL1 로또의 최고 순위와 최저 순위 C++ (0) | 2022.05.22 |