[프로그래머스] 신규 아이디 추천 (C++)
[프로그래머스] 신규 아이디 추천 (C++)
프로그래머스 신규 아이디 추천
📝 문제 요약
주어진 new_id 가 아이디로서 부적절할 경우, 아래 규칙에 따라 추천 아이디를 생성한다.
아이디 생성 규칙
1
2
3
4
5
6
7
8
1단계 모든 대문자를 대응되는 소문자로 치환합니다.
2단계 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
3단계 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
4단계 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
5단계 빈 문자열이라면, "a"를 대입합니다.
6단계 길이가 16자 이상이면, 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
만약 제거 후 마침표(.)가 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
7단계 길이가 2자 이하라면, 마지막 문자를 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
✅ 코드 설명
1
2
int sp = 0;
char stack[new_id.length()];
우선 스택을 이용하여 풀기위해 new_id 길이 만큼의 크기를 가진 stack 과 스택포인터 sp 를 만들어준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
for (char c : new_id) {
if (sp == 0 && c == '.') continue;
if (c >= 'A' && c <= 'Z') c ^= 32;
stack[sp++] = c;
if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')) continue;
if (c != '-' && c != '_' && c != '.') sp -= 1;
if (sp >= 2 && stack[sp-1] == '.' && stack[sp-2] == '.') sp -= 1;
}
sp = min(15, sp);
if (sp > 0 && stack[sp-1] == '.') sp -= 1;
- [1 ~ 4, 6 단계]
- 처음 들어갈 문자에
.이 온다면 다음문자로 스킵 - 대문자라면
c ^= 32으로 소문자로 변환 (대소문자 스와핑하는 코드) - 영소문자거나 숫자면 더이상 필터링할게 없기때문에 다음문자 체크
- 영소문자, 숫자도 아니고
-,_,.도 아니라면stack에 넣었던 문자를 삭제하고.이 연속으로 나온경우에도 똑같이 진행 new_id전체 체크가 끝나면stack크기가 15보다 클경우 리사이징stack마지막 글자에.이 들어갔는지 체크해주고 들어갔다면 삭제
- 처음 들어갈 문자에
1
2
3
4
5
6
if (sp == 0) stack[sp++] = 'a';
const char last = stack[sp-1];
while (sp < 3) stack[sp++] = last;
return string(stack, sp);
- [5, 7단계 + 마무리]
stack크기가 0이면 ‘a’ 문자 담기stack크기가 3보다 작다면 크기가 3이 될때까지 마지막 문자를 계속해서 넣어주기- 문자를 담았던
stack을 string으로 바꿔서 리턴
전체코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <string>
#include <vector>
using namespace std;
string solution(string new_id) {
char stack[new_id.length()];
int sp = 0;
for (char c : new_id) {
if (sp == 0 && c == '.') continue;
if (c >= 'A' && c <= 'Z') c ^= 32;
stack[sp++] = c;
if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')) continue;
if (c != '-' && c != '_' && c != '.') sp -= 1;
if (sp >= 2 && stack[sp-1] == '.' && stack[sp-2] == '.') sp -= 1;
}
sp = min(15, sp);
if (sp > 0 && stack[sp-1] == '.') sp -= 1;
if (sp == 0) stack[sp++] = 'a';
const char last = stack[sp-1];
while (sp < 3) stack[sp++] = last;
return string(stack, sp);
}
This post is licensed under CC BY 4.0 by the author.