문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/72410
핵심 정리
<카카오 아이디 규칙>
- 길이: 3 이상 15 이하
- 사용 가능한 문자: 알파벳 소문자, 숫자, - , _ , .
- 단, . 는 처음과 끝에 사용할 수 없고 연속으로 사용할 수 없음
1. 신규 유저가 입력한 아이디(new_id)가 규칙에 맞는지 검사한다.
2. 규칙에 맞지 않을 경우, 규칙에 맞는 새로운 아이디를 추천한다.
1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
3. 규칙에 맞을 경우, 그대로 리턴한다.
풀이
<첫 답안>
단계별로 그냥 쭉 써내려갔다. 제출했더니 몇 개의 케이스에서 시간 초과를 했다.
function solution(new_id) {
let answer = new_id.toLowerCase().replace(/[^\w\-\.]/g, ''); //1,2단계
answer = answer.replace(/\.{2,}/g,'.'); //3단계
//4단계
if(answer.indexOf('.') === 0) {
answer = answer.replace(answer[0],'');
}
if(answer.indexOf('.') === answer.length-1){
answer = answer.replace(answer[answer.length-1],'');
}
//5단계
if(answer.length === 0){
answer = answer.replace('','a');
}
//6단계
if(answer.length >= 16){
answer = answer.substring(0,15);
if(answer.indexOf('.') === 0) {
answer = answer.replace(answer[0],'');
}
if(answer.indexOf('.') === answer.length-1){
answer = answer.replace(answer[answer.length-1],'');
}
}
//7단계
if(answer.length <=2){
answer = answer.padEnd(3,answer[answer.length-1]);
}
return answer;
}
그래서 단계별로 개선해보았다.
먼저 4단계에서 replace 대신 slice로 변경했다. slice(beginIndex, endIndex)를 하면 해당 값을 찾아 공백으로 replace하는 것보다 효율적이기 때문이다.
5단계에서는 replace를 쓰지 않아도 된다. 어차피 공백이므로 그냥 answer에 a를 대입하면된다.
6단계에서 불필요한 반복이 있었다. 6단계 설명을 보면 "만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다." 라고 했는데 첫 문자까지 고려했다. 그래서 이 부분을 지우고, 코드의 통일성을 위해 substring대신 slice를 사용했다. (두 메서드는 이 문제에서는 완전히 동일하게 작동한다.)
<수정한 답안>
function solution(new_id) {
let answer = new_id.toLowerCase() // 1단계
.replace(/[^\w\-\.]/g, '') //2단계
.replace(/\.{2,}/g,'.'); // 3단계
//4단계
if(answer[0] === '.') answer = answer.slice(1);
if(answer[answer.length-1] === '.') answer = answer.slice(0,-1);
//5단계
if(answer.length === 0) answer ='a';
//6단계
if(answer.length >= 16){
answer = answer.slice(0,15);
if(answer[answer.length-1] === '.') answer = answer.slice(0,-1);
}
//7단계
if(answer.length <=2){
answer = answer.padEnd(3,answer[answer.length-1]);
}
return answer;
}
정규표현식은 아래의 블로그 글을 보면서 작성했다.
https://velog.io/@purplew/Javascript-%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D
Javascript에서 정규표현식(Regular Expression) 사용하기
자바스크립트의 정규표현식 개념과 자주 사용되는 패턴에 대한 활용 예시
velog.io
'알고리즘' 카테고리의 다른 글
[프로그래머스] Lv 2. 거리두기 확인하기 - Javascript 풀이 (1) | 2025.03.01 |
---|---|
[프로그래머스] Lv 1. 키패드 누르기 - Javascript 풀이 (0) | 2025.01.24 |
[프로그래머스] Lv 1. 신고 결과 받기 - Javascript 풀이 (0) | 2025.01.11 |
[프로그래머스] Lv 1. 숫자 문자열과 영단어 - Javascript 풀이 (0) | 2025.01.09 |
[프로그래머스] Lv 1. 성격 유형 검사하기 - Javascript 풀이 (0) | 2025.01.08 |