ALGORITHM/Programmers + α
[프로그래머스] lv1. 신규 아이디 추천 - JS
Harimad
2022. 6. 2. 18:04

문제 출처
코딩테스트 연습 - 신규 아이디 추천
카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로
programmers.co.kr

나의 코드
function solution(new_id) {
var answer = '';
//1단계 대문자 -> 소문자
new_id = new_id.toLowerCase();
//2단계 알파벳소문자, 숫자, 빼기, 밑줄, 마침표 제외한 모든 문자 제거
for (let i = 0; i < new_id.length; i++) {
let char = new_id.charCodeAt(i);
if ((char >= 48 && char <= 57) || (char >= 97 && char <= 122 ) ||char === 45 || char === 95 || char === 46) {
answer += new_id[i];
}
}
//3단계 마침표가 2번 이상 연속된 부분을 하나의 마침표로 치환
answer = answer.split('');
let newAnswer = [];
for (let i = 0; i < answer.length; i++) {
if (answer[i] === '.' && answer[i+1] === '.') continue;
else newAnswer.push(answer[i]);
}
answer = newAnswer;
//4단계 마침표가 처음이나 끝에 위치하면 제거
if (answer[0] === '.') answer.shift();
if (answer[answer.length-1] === '.') answer.pop();
//5단계 인자가 빈 문자열이라면 인자에 'a' 대입
if (!answer.length) answer.push('a');
//6단계 인자의 길이가 16자 이상이면, 첫 15문자 제외한 나머지 문자 제거
//제거 후 마침표가 끝에 위치하면 마침표 제거
if (answer.length >= 16) {
answer = answer.slice(0, 15);
if (answer[answer.length-1] === '.') answer.pop();
}
//7단계 인자 길이가 2 이하면, 마지막 문자를 인자 길이가 3이 될 때까지 반복해서 끝에 붙임
while (answer.length <= 2) {
answer.push(answer[answer.length-1]);
}
return answer.join('');
}
풀이
2단계 부분을 아래와 같이 바꿀 수 있다.
가능한 단어들을 미리 변수에 담아놓고
solution 함수 인자로 들어온 문자를 반복문 돌린다.
그리고 가능한 단어들과 includes 메서드로 매칭시키면서 true가 나오면 answer 변수에 문자를 담아주도록 한다.
new_id = new_id.split('');
let posible = 'abcdefghijklmnopqrstuvwxyz0123456789-_.'.split('');
for (let i = 0; i < new_id.length; i++) {
for (let j = 0; j < posible.length; j++) {
if (new_id[i].includes(posible[j])) {
answer += new_id[i];
}
}
}
return answer;
더 나은 풀이
1. 정규식을 이용한 풀이
const solution = new_id =>
new_id.toLowerCase() // 1단계 대문자 -> 소문자
.replace(/[^\w-_.]/g, "") // 2단계 알파벳소문자, 숫자, 빼기, 밑줄, 마침표 제외한 모든 문자 제거
.replace(/\.+/g, ".") // 3단계 마침표가 2번 이상 연속된 부분을 하나의 마침표로 치환
.replace(/^\.|\.$/g, "") // 4단계 마침표가 처음이나 끝에 위치하면 제거
.replace(/^$/, "a") // 5단계 인자가 빈 문자열이라면 인자에 'a' 대입
.match(/^.{0,14}[^.]/)[0] // 6단계 인자의 길이가 16자 이상이면, 첫 15문자 제외한 나머지 문자 제거 // 제거 후 마침표가 끝에 위치하면 마침표 제거
.replace(/^(.)$/, "$1$1$1") // 7-1단계 인자 길이가 1이면, 마지막 문자를 인자 길이가 3이 될 때까지 반복해서 끝에 붙임
.replace(/^(.)(.)$/, "$1$2$2"); // 7-2단계 인자 길이가 2이면, ""
TEST1 실행결과
solution("...!@BaT#*..y.abcdefghijklm")
//2단계 - '...!@bat#*..y.abcdefghijklm'
//3단계 - '.bat.y.abcdefghijklm'
//5단계 - 'bat.y.abcdefghijklm'
//6단계 - 'bat.y.abcdefghi'
TEST2 실행결과
solution("=.=")
// 2단계 - '.'
// 4단계 - ''
// 5단계 - 'a'
// 6단계 - 'a'
// 7-1단계 - 'aaa'
TEST3 실행결과
solution("z-+.^.")
// 2단계 - 'z-..'
// 3단계 - 'z-.'
// 4단계 - 'z-'
// 7-2단계 - 'z--'
참고
[정규식] 핵심만 모아놓은 Cheat Sheet. 예제를 통하여 정규식의 핵심적인 내용만 깊이있게 알아봅니다 | by chrisjune | Medium
[정규식] 핵심만 모아놓은 Cheat Sheet
예제를 통하여 정규식의 핵심적인 내용만 깊이있게 알아봅니다
chrisjune-13837.medium.com