본문 바로가기
알고리즘/c++ 프로그래머스

[프로그래머스 신규 아이디 추천] c++ (풀이,코드)

by 말린밴댕이_공부 2023. 6. 22.
반응형

문제 링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

 

풀이 및 코드

개인적으로 이 문제는 문제에서 주어진 하라는대로 그대로 하면 되는 문제라고 생각합니다.

 

문제에서 주어진 조건을 하나대로 하라는대로 하기만 해서 큰 무리는 없지만 풀때 약간 까먹어서 헷갈리는 그런것들에 대해서 다시 짐작을 하느라 조금은 예상시간보다는 오래걸렸네요. (카카오는 지문이 너무 길어..)

 

substr, erase, strchr, back 뭐 등등 string에서 사용될만한 모든것들에 대해서 사용을 하여 다시 상기시키는 문제가 아니었나 생각합니다. (만약 까먹었다면 순수 노가다로 구현을..)

 

#include <string>
#include <vector>
#include <iostream>

using namespace std;

string solution(string new_id) {
    int i = 0;
   
    for(int i = 0; i < new_id.length();i++){
        //1단계 대문자 -> 소문자
        new_id[i] = tolower(new_id[i]);
    }
    for(int i = 0; i < new_id.length();i++){
        //2단계 소문자,숫자,빼기,밑줄,마침표를 제외한 모든 문자 제거
        if(!(('a' <= new_id[i] && new_id[i] <= 'z') || ('0' <= new_id[i] && new_id[i] <= '9')
            || new_id[i] == '-' || new_id[i] == '_' || new_id[i] == '.')){
            new_id.erase(new_id.begin() + i);
            i--;
        }
    }
   
    for(int i = 0; i < new_id.length();i++){
        //3단계 ..2이상 -> 지움
        if(i < new_id.length() - 1 && new_id[i] == '.' && new_id[i + 1] == '.'){
            new_id.erase(new_id.begin() + i);
            i--;
        }
    }
    for(int i = 0; i < new_id.length();i++){
        //4단계 처음이나 끝이면제거
        if ((i == 0 || i == new_id.length() - 1) && new_id[i] == '.'){
            new_id.erase(new_id.begin()+i);
            i--;
        }
    }
   
    //5단계 -> 비어있다면 a
    if(new_id.empty())
        new_id = "a";
   
    //6단계 16자 이상 첫 15개를 제외한 다 지움 맨 뒤에 .이 있다면 제거
    if(new_id.length() >= 16){
        new_id = new_id.substr(0,15);
        //맨마지막 .이라면 제거
        if(new_id[14] == '.')
            new_id.erase(new_id.begin() + 14);
    }
   
    //7단계 2자 이하라면 붙히기
    if(new_id.length() <= 2){
        while(new_id.length() < 3){
            new_id += new_id.back();
        }
    }
   
    return new_id;
}

문제를 풀고나서 느꼈는데

if(!(('a' <= new_id[i] && new_id[i] <= 'z') || ('0' <= new_id[i] && new_id[i] <= '9')
            || new_id[i] == '-' || new_id[i] == '_' || new_id[i] == '.')){
            new_id.erase(new_id.begin() + i);
            i--;
        }

2단계에서 || new_id[i] == '-' || new_id[i] == '_' || new_id[i] == '.' 이 부분을 그냥 strchr("-_.",new_id[i]) 이런식으로 사용을 했어도 괜찮지 않았을까 하는 생각이 듭니다. 물론 코드에 대한 풀이를 집중을 하는거지만 끝나고 다른 사람의 리뷰를 보니 strchr를 사용하는것도 좋다고 생각합니다.

반응형

댓글