#include <string>
#include <vector>
using namespace std;
string solution(string new_id) {
string answer = "";
for(int i=0; i<new_id.length(); i++){
new_id[i] = tolower(new_id[i]); // 대문자 소문자로 바꿔주기
if(isalnum(new_id[i]) || new_id[i] == '-' || new_id[i] == '_'){
answer += new_id[i]; // 알파벳, 숫자, -, _ 이면 answer에 넣음
continue;
}
if(new_id[i] == '.' && answer.length() != 0 && answer.back() != '.')
answer += new_id[i]; // .가 맨앞이거나 2번 이상 연속되면 answer에 넣지않음
}
if(answer.back() == '.') // .가 answer 마지막에 있으면 제거
answer.pop_back();
if(answer.length() == 0) // answer 길이가 0이면 "aaa" 리턴
return "aaa";
else if(answer.length() >= 16) // answer 길이가 16보다 크면 길이 15로 자름
answer = answer.substr(0, 15);
if(answer.back() == '.') // .가 answer 마지막에 있으면 제거
answer.pop_back();
while(answer.length() <= 2) // answer 길이가 2보다 작거나 같으면 마지막 글자를 길이가 3이 될때까지 추가
answer += answer.back();
return answer;
}
문제 정리:
https://programmers.co.kr/learn/courses/30/lessons/72410
코딩테스트 연습 - 신규 아이디 추천
카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로
programmers.co.kr
input
- string new_id : 유저가 입력한 id
- 1단계 : 대문자는 모두 소문자로
- 2단계 : 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거
- 3단계 : 마침표(.)가 연속되지않게 하나만 남겨둠
- 4단계 : 마침표(.)가 처음이나 끝에 위치한다면 제거
- 5단계 : 4단계까지 마친 후 빈 문자열이라면, "a"를 대입합니다.
- 6단계 : 길이가 16자 이상이면, 첫 15개의 문자만 남김
제거 후 마침표(.)가 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거
- 7단계 : 2자 이하라면, 마지막 문자를 길이가 3이 될 때까지 반복해서 끝에 붙임
output
- 만들어진 새로운 추천 아이디를 리턴
[접근1]
new_id안에서 작업하려니 힘들어서 answer에 조건에 맞는 문자를 넣기로 했다.
new_id의 문자 하나하나를 도는데
그 문자를 소문자로 바꿔준다
그 문자가 알파벳이거나 숫자거나, '-'이거나, '_'이면 바로 answer에 넣고
그 문자가 '.'인데 answer가 비어있지않고('.'가 맨 앞에 안오게 하려고) answer의 마지막이 '.'이 아니면('.'가 연속되지 않게 하기 위해서) answer에 넣음
이렇게 만들어진 answer의 마지막에 '.'가 있다면 제거
string answer = "";
for(int i=0; i<new_id.length(); i++){
new_id[i] = tolower(new_id[i]); // 대문자 소문자로 바꿔주기
if(isalnum(new_id[i]) || new_id[i] == '-' || new_id[i] == '_'){
answer += new_id[i]; // 알파벳, 숫자, -, _ 이면 answer에 넣음
continue;
}
if(new_id[i] == '.' && answer.length() != 0 && answer.back() != '.')
answer += new_id[i]; // .가 맨앞이거나 2번 이상 연속되면 answer에 넣지않음
}
if(answer.back() == '.') // .가 answer 마지막에 있으면 제거
answer.pop_back();
[접근2]
answer 길이가 0이면 "a"를 추가하는데, 나중에 어차피 answer의 길이가 2 이하면 길이가 3이 될때까지 맨 뒤의 문자를 추가하므로 바로 "aaa"를 return해줘도 된다.
answer 길이가 16이상이면 .substr을 이용해서 첫 15개의 문자만 남기고
이렇게 만들어진 answer의 마지막에 '.'가 있다면 제거
answer의 길이가 2보다 작거나 같으면 마지막 문자를 길이가 3이 될때까지 answer에 추가
if(answer.length() == 0) // answer 길이가 0이면 "aaa" 리턴
return "aaa";
else if(answer.length() >= 16) // answer 길이가 16보다 크면 길이 15로 자름
answer = answer.substr(0, 15);
if(answer.back() == '.') // .가 answer 마지막에 있으면 제거
answer.pop_back();
while(answer.length() <= 2) // answer 길이가 2보다 작거나 같으면 마지막 글자를 길이가 3이 될때까지 추가
answer += answer.back();'coding > algorithm' 카테고리의 다른 글
| [programmers] Lv.2 오픈채팅방(c++) (0) | 2022.04.18 |
|---|---|
| [programmers] Lv.2 문자열 압축(c++) (0) | 2022.04.15 |
| [programmers] Lv.1 숫자 문자열과 영단어(c++) (0) | 2022.03.08 |
| [programmers] Lv.1 로또의 최고 순위와 최저 순위(c++) (0) | 2022.02.28 |
| [programmers] Lv.1 신고 결과 받기(c++) (0) | 2022.02.25 |
댓글