Post

[프로그래머스] 신규 아이디 추천 (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.

Trending Tags