문제
소스코드
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)
'온라인 코딩 > 문자열(String)' 카테고리의 다른 글
[백준] 10808번 알파벳 개수 (0) | 2020.07.26 |
---|---|
[백준] 1316번 그룹 단어 체커 (0) | 2020.05.08 |
[프로그래머스] 핸드폰 번호 가리기 (0) | 2020.04.24 |
[백준] 2908번 상수 (0) | 2020.02.27 |
[백준] 11720번 숫자의 합 (0) | 2020.02.25 |