어흥

[프로그래머스] 신규 아이디 추천 (C++) 본문

알고리즘/프로그래머스

[프로그래머스] 신규 아이디 추천 (C++)

라이언납시오 2021. 9. 10. 19:13
728x90
반응형

문제 링크: https://programmers.co.kr/learn/courses/30/lessons/72410

 

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

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

programmers.co.kr

1. 주의할 점

- 문제의 조건을 잘 이해하고 그대로 구현한다

 

2. 구현

- dq 덱을에 new_id를 1차 필터링 한 결과를 담는다(특정 문자 + 연속된 . 처리 + 대문자→소문자) : 1,2,3번 조건 처리

- Cnt 변수를 통해 덱의 크기를 나타낸다

- if문을 각각 수행하여 덱의 가장 앞쪽과 뒤쪽이 . 이면 제거한다 : 4번 조건 처리

- 덱이 비었다면 'a'를 추가한다 : 5번 조건 처리

- While문을 통해 7번 조건을 처리한다

- For문을 통해 덱의 크기가 15자리를 넘어선다면 최대 15개의 문자만 가져오며, 마지막 문자가 . 인 경우에는 붙이지 않는다 : 6번 조건

#include <string>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;

string solution(string new_id) {
    deque<char> dq;
    string answer = "";
    int len = new_id.size();
    int cnt=0;
    
    for(int i=0;i<len;i++){
        char c = new_id[i];
        if(('a'<=c && c<='z')||c=='-'||c=='_')   dq.push_back(c);
        else if('A'<=c&&c<='Z') dq.push_back(tolower(c));
        else if(c=='.'){
            if(cnt>0 && dq[cnt-1]=='.') continue;
            else dq.push_back(c);
        }
        else if(0<=c-'0' && c-'0'<=9)   dq.push_back(c);
        else continue;
        cnt++;
    }
    //앞쪽 제거
    if(cnt && dq[0]=='.'){
        dq.pop_front();
        cnt--;
    }
    //뒤쪽 제거
    if(cnt && dq[cnt-1]=='.'){
        dq.pop_back();
        cnt--;
    }
    
    if(dq.empty()){
        dq.push_back('a');
        cnt++;
    }
    while(cnt<3){
        dq.push_back(dq[cnt-1]);
        cnt++;
    }
    for(int i=0;i<min(cnt,15);i++){
        if(i==14 && dq[i]=='.') break;
        answer+=dq[i];
    }
    return answer;
}
728x90
반응형
Comments