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