알고리즘 문제풀이
[프로그래머스] 알고리즘 71일차 : 신규 아이디 추천
SiO2whocode
2021. 1. 25. 17:22
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