티스토리 뷰

728x90

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

 

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

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

programmers.co.kr

C++ 문자열 코딩테스트 연습

2021 카카오 블라인드 코테 문제

  • 아이디의 길이는 3자 이상 15자 이하여야 합니다.
  • 아이디는 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 문자만 사용할 수 있습니다.
  • 단, 마침표(.)는 처음과 끝에 사용할 수 없으며 또한 연속으로 사용할 수 없습니다.

문자열을 이런 규칙을 만족하도록 수정하는 문제

 

string 메서드 찾아보면 쉽게 풀 수 있었겠지만..최대한 아는 선에서 해보려고 좀 오래 걸렸다.

마침표 연속으로 쓴 것 제외하는 부분에서 가장 시간을 많이 썼다. erase 쓰는게 익숙하지 않아서 그랬던 것 같다.

백준에서 문자열 너무 안쓰다보니까 역시 퇴화함..

 

문제에 7단계를 순차적으로 처리하는 코드를 짜라고 되어있지만 최대한 반복문 적게쓰고 해결할 수 있는 방법 찾다가

어차피 7단계면 7n이니까 시간복잡도가 그렇게 클 것 같진 않아서 그냥 순차적으로 처리하기로 했다.

 

오답노트

erase(iter, iter)랑 erase(index, cnt) 쓰는 경우를 헷갈려서 마지막에 오류났었다.

나머지는 무난하게 푼 듯

 

소스코드

#include <string>
#include <vector>

using namespace std;

string solution(string new_id) {
    string answer = "";
    
    for(int i = 0 ; i < new_id.length() ; i++){
        if(new_id[i] >= 65 && new_id[i] <= 90){
            answer += tolower(new_id[i]);
            continue;
        }
        if((new_id[i] >= 48 && new_id[i] <= 57)||(new_id[i] >= 96 && new_id[i] <= 122) || new_id[i] == '-' || new_id[i] == '_' || new_id[i] == '.'){
            answer += new_id[i];
        }
    }
    int cnt = 0;
    for(int i = 0 ; i < answer.length() ; i++){
        if(answer[i] == '.'){
            cnt++;
        }else{
            if(cnt > 1){
                answer.erase(i-cnt,cnt-1);
                i = i-(cnt-1);
                cnt = 0;
            }
            else if(cnt == 1){
                cnt = 0;
            }
        }
    }

    while(answer.front() == '.'){
        answer.erase(answer.begin());
    }
    while(answer.back() == '.'){
        answer.pop_back();
    }
    
    while(answer.length() > 15){
        answer.pop_back();
    }
    if(answer.back() == '.'){
        answer.pop_back();
    }
    while(answer.length() <= 2){
        if(answer.length() == 0){
            answer = "a";
        }
        answer += answer.back();
    }
    
    return answer;
}
728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함