[프로그래머스/C++] ㅡ LV1 - 신규 아이디 추천
문제
programmers.co.kr/learn/courses/30/lessons/72410
코딩테스트 연습 - 신규 아이디 추천
카카오에 입사한 신입 개발자 네오는 카카오계정개발팀에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. 네오에게 주어진 첫 업무는 새로 가
programmers.co.kr
풀이
#include <string>
#include <vector>
using namespace std;
string solution(string new_id) {
for (int i=0; i<new_id.size(); i++) { // 1단계 적용
if (new_id[i]>=65 && new_id[i]<=90) {
new_id[i]+=32;
}
}
string next_id = "";
for (int i=0; i<new_id.size(); i++) { // 2단계 적용
if ((new_id[i]>=97 && new_id[i]<=122)||(new_id[i]>=48 && new_id[i]<=57) || new_id[i]=='-' || new_id[i]=='_' || new_id[i]=='.') {
next_id+=new_id[i];
}
}
new_id.clear();
for (int i=0; i<next_id.size(); i++) { // 3단계 적용
if (next_id[i]=='.') {
if (next_id[i]!=next_id[i-1]) {
new_id+=next_id[i];
}
}
else {
new_id+=next_id[i];
}
}
if (new_id[0] == '.') new_id.erase(0, 1); // 4단계 적용
if (new_id[new_id.size()-1] == '.') new_id.erase(new_id.size()-1, 1);
if (new_id.empty()) new_id+='a'; // 5단계 적용
if (new_id.size() >= 16) new_id.erase(15); // 6단계 적용
if (new_id[new_id.size()-1] == '.') new_id.erase(new_id.size()-1, 1);
for (int i=new_id.size()-1; i<2; i++) // 7단계 적용
new_id+=new_id[i];
return new_id;
}
개념
C++의 string에 관한 문법을 많이 사용한다.
추가
+=를 사용해서 문자열 추가 또는 문자 수정이 가능하다.
next_id+=new_id[i];
값은 next_id의 끝부분에 추가된다.
new_id[i]+=32;
문자열 new_id의 인덱스에 해당하는 값(문자)에 + 32가 된다.
삭제
다음 두 식을 구분할 수 있어야 한다.
new_id.erase(0, 1)
이는 0번째 인자부터 1개의 문자열을 제거하는 뜻이다.
new_id.erase(0)
이는 0번째 인자부터 문자열 끝까지 제거한다.
기타
new_id.size()
문자열의 길이를 나타낸다.(배열의 인자처럼 사용하려면 -1을 해야한다)
new_id.clear()
들어 있는 문자열을 비운다.
new_id.empty()
문자열이 텅빈 경우 true를 반환한다.
풀이
주어진 7단계 순서대로 문제를 해결했다.
몇 개의 단계를 묶으면 좀 더 간단해 질 것 같으나, 반드시 선행되어야 하는 부분이 있었다.
step1
일단 문자열의 요소가 대문자인 경우를 if문으로 받아서 +32를 해서 소문자로 바꾼다.
step2
문자열 요소가 소문자 or 숫자 or ' . ' or ' _ ' or ' - ' 인 경우, 새로운 문자열 next_id에 대입한다.
step3
new_id를 clear한다.
next_id를 탐색하며 요소가 ' . ' 이며 이전 요소도 ' . '이 아니라면 new_id에 대입한다.
애초에 ' . '이 아니여도 new_id 에 대입한다.
step4
첫번째 index와 마지막 index가 각각 ' . ' 일 때 erase한다.
step5
문자열이 텅빈 경우 문자 a를 추가한다.
step6
문자열이 16보다 길 때, erase(15)를 사용해서 뒷부분을 모두 제거한다.
그리고 step4와 동일하게 마지막 index가 ' . ' 일 때 erase한다.
step7
문자열의 길이가 3보다 작을 때, 마지막번째의 문자를 문자열을 더 추가한다.
반복문 전에 if를 사용하지 않는 것은, for문 안의 반복에도 조건이 있기 때문이다.