대략 소문자, 숫자, -, _, .이고 3 <= length <= 15이며, 앞과 뒤에 .은 들어올 수 없다는 규칙이다.
대략 regex를 쓰면 편하겠다 생각하고 예전에 잠깐 스쳐지나간 엘리님의 추천사이트를 이용해 어찌저찌 만들어 갔다.
첫 풀이다.
function solution(new_id) {
var answer = '';
answer = new_id.toLowerCase();
let regex = /[^(\d|\w|\.|\-|\_)]/g;
answer = answer.replace(regex, '');
regex = /\.{2,}/g;
answer = answer.replace(regex, '.');
if(answer[0] == '.'){
answer = answer.slice(1);
}
if(answer[answer.length-1] == '.'){
answer = answer.slice(0, answer.length-1);
}
if(answer.length === 0){
return 'aaa';
}
if(answer.length > 15){
answer = answer.slice(0, 15);
if(answer[answer.length-1] == '.'){
answer = answer.slice(0, answer.length-1);
}
}
while(answer.length < 3){
answer = answer + answer[answer.length-1];
}
return answer;
}
체이닝을 활용할 수 있는데 사용하지 않았다.
()
는 제거하지 못한다.
g옵션을 이용하면 replaceAll과 같은 효과를 낸다.(replaceAll은 최신 브라우저에서만 적용되는 메서드라 프로그래머스사이트에선 적용되지 않는다.)
2번 문제는 ()는 당연히 묶는 연산이라 생각한 나의 잘못이다.
/[^\d|\w|\.|\-|\_]/g
이렇게 하니 잘 되었다.
다른사람 풀이를 보니 체이닝을 굉장히 잘 이용한 유저가 1등을 먹고있었다.
대충 할 수 있다는 사실만 캐치하고 최대한 혼자해보려했다.
1번은 최대한 혼자 해보려했지만, 맨 끝과 맨 처음의 .을 구하는 부분과
빈 문자열을 찾는 부분을 보고말았다.
function solution(new_id) {
var answer = new_id.toLowerCase()
.replace(/[^\w|\.|\-]/g, '')
.replace(/\.{2,}/g, '.') // .이 두개 이상
.replace(/^\.|\.$/g, '') // 처음과 끝에 .
.replace(/^$/, 'a') // 빈 문자열..!
.slice(0, 15).replace(/\.$/, '');
const len = answer.length;
return len > 2? answer:answer+answer.charAt(len-1).repeat(3-len);
}
regex를 활용해볼 기회를 줘서 너무 좋았다.
항상 느끼는 거지만 kakao는 문제도 뭔가 실제로 쓰일만한 부분을 내는 것 같아 좋다.
앞으로도 문자열 검사는 왠만하면 regex를 이용해 더 익숙해지면 좋겠다.