본문 바로가기

온라인 코딩/문자열(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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <string>
#include <vector>
#include<algorithm>
 
using namespace std;
 
bool ChekInValid(int ch) {
 
    //If 중 하나라도 해당되면 false
    bool invalid{ true };
 
    if ('a' <= ch && ch <= 'z')invalid = false;
    if ('0' <= ch && ch <= '9')invalid = false;
    if ('.'== ch)invalid = false;
    if ('_' == ch || ch == '-') invalid = false;
    return invalid;
}
 
string solution(string new_id) {
    string answer = "";
 
    //1단계 
    for (int i = 0; i < new_id.size(); ++i) {
        auto temp = std::tolower(new_id[i]);
        //2단계 
        if (ChekInValid(temp) == false) {
            answer.push_back(temp);
        }
 
    }
 
    //3단계
    answer.erase(std::unique(answer.begin(), answer.end(), [](const auto& lhs, const auto& rhs) {
 
        if (lhs == '.' && rhs == '.')
            return true;
        return false;
    }),answer.end());
 
 
    //4단계
    if (*answer.begin() == '.')
        answer.erase(answer.begin());
    if (*(answer.end() - 1== '.') {
        answer.erase(answer.end() - 1);
    }
 
 
    //5단계
    if (answer.size() == 0) {
        answer.push_back('a');
    }
 
    //6단계
    if (answer.size() >= 16) {
        answer.erase(answer.begin() + 15, answer.end());
 
        if(*(answer.end()-1)== '.')
            answer.erase(answer.end() - 1);
    }
 
    //7단계
    if (answer.size() <= 2) {
        auto lastWord = *(answer.end() - 1);
        while (answer.size() != 3) {
            answer.push_back(lastWord);
        }
    }
 
    return answer;
}
 

후기

 

이 문제를 해결하기 위한 키워드는 문자열이다.

이 문제는 주어진 7단계의 조건을 만족하는 ID를 만드는 문제로 해당 단계를 모두 거친 문자열이 정답이 된다.

각 단계별로 간단히 설명을 하면

1단계: std::tolower를 사용해 알파벳 대문자를 소문자로 변경

2단계: 유효한 문자인지 체크 후 answer 컨테이너에 삽입

3단계: std::unique() 함수를 사용해 중복된 문자를 찾아서 삭제

4단계: 처음과 끝 반복자에 해당 문자가 있는지 체크 

5단계: answer의 size가 0이라면 해당 문자 삽입

6단계: answer의 size가 16 이상이라면 std::erase()에 범위를 설정해 그 이상 문자는 삭제

7단계: answer의 size가 2개 이하라며 마지막 문자를 3이 될 때까지 반복 삽입

 

난이도 Level 1이라 어렵지는 않았다. 

해결하는데 걸린 시간: 20분

 

출처 및 레퍼런스

문제 링크: 코딩 테스트 연습 - 신규 아이디 추천 | 프로그래머스 (programmers.co.kr)