Home [Programmers] 카카오 블라인드 2021 - 신규 아이디 추천
Post
Cancel

[Programmers] 카카오 블라인드 2021 - 신규 아이디 추천

카카오 블라인드 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를 반드시 다시 한 번 해주셔야합니다.

This post is licensed under CC BY 4.0 by the author.

[BOJ] 1743 음식물 피하기

[BoostCamp AI Tech / Level 1 - Python/PyTorch] Day3 - Numpy

Comments powered by Disqus.