카카오 블라인드 2021 - 신규 아이디 추천
Kakao Blind Recruit 2021 - 신규 아이디 추천
문제 Comment
카카오 블라인드 코딩 테스트의 요즘 트렌드는 “구현”입니다.
매년 인턴십, 블라인드 코테에 이런식으 조건을 부여하고 구현하는 문제들이 꼭 1문제씩은 출제합니다.
이런 문제를 접근할 때는 문제상에 구현의 힌트를 많이 주기때문에 문제와 주어진 예시를 잘 파악하는 것이 좋습니다.
문제 풀이
문자열을 control하는 문제인 만큼 파이썬이 유리할 수도 있지만 C++로 접근해도 충분히 괜찮은 문제입니다.
문제 풀이 접근에서 치환과 추가는 어렵지 않습니다.
하지만 제거의 효율을 높이고자 제거되는 문자열은 ‘\0’로 변경해주었습니다.
~지금 생각해보면 그렇게 효율이 좋은것 같지는 않은 것 같기도…~
C++의 문자열에서 ‘\0’은 출력상에 표현하지 않기 때문입니다.
단, 여기서 주의할 점은 string을 비교할 때, 중간에 들어간 \0은 유지가 되므로 출력이 같은 문자열이 서로 다른 문자열로 인식됩니다.
1
2
string str1 = "abcd";
string str2 = "a\0bcd";
이런 경우 C++의 채점서버는 두 문자열이 다르다고 채점을 하고 심지어 두 문자열의 길이도 str1은 4, str2는 5로 반환합니다.
따라서 길이와 관련된 작업이 있거나 제거 작업이 끝난 후에는 반드시 \0을 빼고 문자열을 재구성할 필요가 있습니다.
코드
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <string>
#include <vector>
#include <iostream>
using namespace std;
string reset(string input) {
string ret = "";
for(int i = 0; i < input.size(); i++) {
if(input[i] != '\0') ret += input[i];
}
return ret;
}
string solution(string new_id) {
string answer = "";
char m[3] = {'-', '_', '.'};
// step 1
for(int i = 0; i < new_id.size(); i++) {
new_id[i] = tolower(new_id[i]);
}
// step 2
for(int i = 0; i < new_id.size(); i++) {
bool flag = false;
if(new_id[i] < 'a' || new_id[i] > 'z') {
if(new_id[i]-'0' >= 0 && new_id[i]-'0' <= 9) continue;
else {
for(int j = 0; j < 3; j++) {
if(new_id[i] == m[j]) {
flag = true;
break;
}
}
if(!flag) {
new_id[i] = '\0';
}
}
}
}
new_id = reset(new_id);
char prev = new_id[0];
// step 3
for(int i = 1; i < new_id.size(); i++) {
if(prev == '.' && new_id[i] == '.') {
prev = new_id[i];
new_id[i] = '\0';
}else{
prev = new_id[i];
}
}
new_id = reset(new_id);
// step 4
if(new_id[0] == '.') new_id[0] = '\0';
if(new_id[new_id.size() - 1] == '.') new_id[new_id.size() - 1] = '\0';
new_id = reset(new_id);
// step 5
if(new_id.size() == 0) new_id += 'a';
// step 6
if(new_id.size() > 15) {
for(int i = 15; i < new_id.size(); i++) {
new_id[i] = '\0';
}
}
new_id = reset(new_id);
// step 4
if(new_id[0] == '.') new_id[0] = '\0';
if(new_id[new_id.size() - 1] == '.') new_id[new_id.size() - 1] = '\0';
new_id = reset(new_id);
// step 7
if(new_id.size() < 3) {
while(new_id.size() != 3) {
new_id += new_id[new_id.size() - 1];
}
}
answer = new_id;
return answer;
}
step 6를 종료한 후 양 끝의 마침표를 제거해야하므로 step4를 반드시 다시 한 번 해주셔야합니다.
Comments powered by Disqus.