https://programmers.co.kr/learn/courses/30/lessons/72410

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr


문제 Comment

 

카카오 블라인드 코딩 테스트의 요즘 트렌드는 "구현"입니다.

매년 인턴십, 블라인드 코테에 이런식으 조건을 부여하고 구현하는 문제들이 꼭 1문제씩은 출제합니다.

이런 문제를 접근할 때는 문제상에 구현의 힌트를 많이 주기때문에 문제와 주어진 예시를 잘 파악하는 것이 좋습니다.

 


문제 풀이

 

문자열을 control하는 문제인 만큼 파이썬이 유리할 수도 있지만 C++로 접근해도 충분히 괜찮은 문제입니다.

문제 풀이 접근에서 치환과 추가는 어렵지 않습니다.

하지만 제거의 효율을 높이고자 제거되는 문자열은 '\0'로 변경해주었습니다. 

지금 생각해보면 그렇게 효율이 좋은것 같지는 않은 것 같기도...

C++의 문자열에서 '\0'은 출력상에 표현하지 않기 때문입니다.

단, 여기서 주의할 점은 string을 비교할 때, 중간에 들어간 \0은 유지가 되므로 출력이 같은 문자열이 서로 다른 문자열로 인식됩니다.

string str1 = "abcd";
string str2 = "a\0bcd";

이런 경우 C++의 채점서버는 두 문자열이 다르다고 채점을 하고 심지어 두 문자열의 길이도 str1은 4, str2는 5로 반환합니다.

따라서 길이와 관련된 작업이 있거나 제거 작업이 끝난 후에는 반드시 \0을 빼고 문자열을 재구성할 필요가 있습니다.

 


코드

 

#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를 반드시 다시 한 번 해주셔야합니다.

 

반응형