프로그래머스 - 신규 아이디 추천

Sam·2023년 3월 27일
0
post-thumbnail

프로그래머스 카카오 코딩테스트 문제이다.

  • 아이디의 길이는 3자 이상 15자 이하여야 합니다.
  • 아이디는 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 문자만 사용할 수 있습니다.
  • 단, 마침표(.)는 처음과 끝에 사용할 수 없으며 또한 연속으로 사용할 수 없습니다.

문제는 7단계로 나눠서 풀어봤다.

1. 모든 대문자 소문자로 치환하기

let answer = new_id.toLowerCase();

2. 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 문자를 제외한 나머지를 제거한다.

여기서 정규식을 공부해서 정규식을 사용했다.

정규식이란?

문자열에서 특정 문자 조합을 찾기 위한 패턴이다. Javascript 정규 표현식도 객체로서, RegExp의 exec()와 test() 메서드를 사용할 수 있습니다. String의 match(), matchAll() (en-US), replace(), replaceAll(), search(), split() 메서드와도 함께 사용할 수 있습니다. 이 장에서는 JavaScript의 정규 표현식을 설명합니다.

문자열을 조금 더 쉽게 찾기 위해서 사용하는 식이다.

그러면 이 정규식은 어떻게 사용하는 것일까? 드림코딩님의 정규식 강의 영상을 참고했다.

링크) 정규표현식 , 더이상 미루지 말자 🤩


위 표는 정규식에서 사용되는 문자들이다. 이 문자를 참고해서 문제를 풀어보자.

다시 2단계로 돌아온다.

.replace(/[^\.a-z0-9-_]/g, "")

[]내부의 ^는 "아닌 것" 즉, 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 문자 외의 문자들은 제거하는 것이다.

3. new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환

.replace(/\.+/g, ".")

마침표가 +(하나, 또는 여러 개가 있을 때) 마침표 하나로 치환한다.

4. new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거한다.

.replace(/^\.|\.$/, "")

^는 문장의 시작, $는 문장의 끝을 의미한다. 즉, 문장의 시작 또는 끝에 있는 마침표는 제거한다.

5. new_id가 빈 문자열이라면, new_id에 "a"를 대입한다.

if (answer.length === 0) answer = "a";

6. new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거한다.
만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거한다.

answer = answer.slice(0, 15).replace(/\.+$/, "")

slice() 함수는 특정 index 사이에 있는 문자만 남기고 자르는 것이다. 즉 slice(0, 15)이기 때문에 index(0) ~ index(15) 사이만 남기고 나머지는 제거하는 것이다. 그 이후 15번째 문자가 "."이라면 제거한다.

7. new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙인다.

while (answer.length < 3) {
        answer += answer[answer.length - 1];
    }

while 문을 사용했다. answer의 길이가 3이 될 때 까지 마지막 문자를 계속 더하는 작업을 반복했다.

아래는 완성 코드이다.

function solution(new_id) {
    let answer = new_id
                    .toLowerCase()
                    .replace(/[^\.a-z0-9-_]/g, "") // 2단계
                    .replace(/\.+/g, ".") // 3단계
                    .replace(/^\.|\.$/, "") // 4단계
    
    if (answer.length === 0) answer = "a"; // 5단계
    
    answer = answer.slice(0, 15).replace(/\.+$/, ""); // 6단계
    
    while (answer.length < 3) {
        answer += answer[answer.length - 1];
    }
    
    
    return answer;
}

이 문제를 통해서 정규식에 대해 제대로 배울 수 있었고, 나눠서 문제를 생각해보는 법을 조금 더 발전시킬 수 있었다.

0개의 댓글