프로그래머스 Lv.1 [2021 KAKAO BLIND RECRUITMENT] - 신규 아이디 추천 (정답률 하위 TOP 6)

세나정·2023년 5월 5일
1

문제

입출력 예 #1
문제의 예시와 같습니다.

입출력 예 #2
7단계를 거치는 동안 new_id가 변화하는 과정은 아래와 같습니다.

1단계 변화 없습니다.
2단계 "z-+.^." → "z-.."
3단계 "z-.." → "z-."
4단계 "z-." → "z-"
5단계 변화 없습니다.
6단계 변화 없습니다.
7단계 "z-" → "z--"

입출력 예 #3
7단계를 거치는 동안 new_id가 변화하는 과정은 아래와 같습니다.

1단계 변화 없습니다.
2단계 "=.=" → "."
3단계 변화 없습니다.
4단계 "." → "" (new_id가 빈 문자열이 되었습니다.)
5단계 "" → "a"
6단계 변화 없습니다.
7단계 "a" → "aaa"

입출력 예 #4
1단계에서 7단계까지 거치는 동안 new_id("123_.def")는 변하지 않습니다. 즉, new_id가 처음부터 카카오의 아이디 규칙에 맞습니다.

입출력 예 #5
1단계 변화 없습니다.
2단계 변화 없습니다.
3단계 변화 없습니다.
4단계 변화 없습니다.
5단계 변화 없습니다.
6단계 "abcdefghijklmn.p" → "abcdefghijklmn." → "abcdefghijklmn"
7단계 변화 없습니다.

내 풀이

문제를 보자마자 정규표현식을 사용하는 문제임을 알고 기억을 더듬기+MDN+ 정리본을 통해 조건에 알맞게 풀고 TC도 완벽히 통과를 했다. 하지만 다른사람 풀이를 봤을 때 체이닝 방법을 깨닫고는 조금 아쉽다는 생각을 했다. 함수로 만들어서 한번 더 반복함에 이상이 없음을 깨닫고 한 건 좋은 시도였지만 체이닝을 하면 더 좋을 것 같다.

function solution(new_id) {
    new_id = word_test(new_id)
    return word_test(new_id)
}

function word_test(word) {
    // 1단계 : 모두 소문자로 
    word = word.toLowerCase()
    
    // 2단계 : 주어진 문자 제외 제거
    word = word.match(/[0-9a-zA-Z-_.]/g).join('')
  
    // 3단계 : 온점 여러개를 한 개로 변경 - 특수기호엔 검사시엔 백슬래시 (\) 꼭 붙여주기
    word = word.replace(/\.+/g, '.')
    
    // 4단계 : 마침표가 처음이나 끝에 있으면 제거 ^지울문자|지울문자$
    word = word.replace(/^\.|\.$/g, "")
     
    // 5단계 : 빈문자열이라면 word에 'a'대입
    word ? word = word : word = 'a'
    
    // 6단계 : 16자이상이라면 15개 남기고 삭제 
    word = word.substring(0, 15)
    
    // 7단계 : 2자 이하라면 word의 마지막 문자를 word의 길이가 3이 될 때까지 끝에 붙임
    if (word.length <= 2) {
        while (word.length < 3)
        word += word[word.length-1]
    }
    
    return word
}

체이닝을 활용한 풀이

function solution(new_id) {
    const answer = new_id
        .toLowerCase() // 1 : 전부 소문자로 
        .replace(/[^\w-_.]/g, '') // 2 : 주어진 문자 외 제거
        .replace(/\.+/g, '.') // 3 : 온점 여러개를 한 개로
        .replace(/^\.|\.$/g, '') // 4 : 처음이나 끝이 마침표면 제거
        .replace(/^$/, 'a') // 5 : 시작과 끝이 아무것도 없다면 a대입
        .slice(0, 15).replace(/\.$/, ''); // 6 : 
    const len = answer.length;
    return len > 2 ? answer : answer + answer.charAt(len - 1).repeat(3 - len);
}

체이닝을 안 쓰고 내 답변을 고친다면

function solution(new_id) {
    new_id = word_test(new_id)
    return word_test(new_id)
}

function word_test(word) {
    // 1단계 : 모두 소문자로 
    word = word.toLowerCase()
    
    // 2단계 : 주어진 문자 제외 제거 - \w : 알파벳 대소문자, 숫자, 밑줄 문자(_)와 일치하는 문자 -와 .추가
    word = word.replace(/[^\w-.]/g, '')
  
    // 3단계 : 온점 여러개를 한 개로 변경 - 특수기호엔 검사시엔 백슬래시 (\) 꼭 붙여주기
    word = word.replace(/\.+/g, '.')
    
    // 4단계 : 마침표가 처음이나 끝에 있으면 제거 ^지울문자|지울문자$
    word = word.replace(/^\.|\.$/g, "")
     
    // 5단계 : 빈문자열이라면 word에 'a'대입
    word = word.replace(/^$/, 'a') // 5 : 시작과 끝이 아무것도 없다면 a대입
    
    // 6단계 : 16자이상이라면 15개 남기고 삭제 
    word = word.substring(0, 15)
    
    // 7단계 : 2자 이하라면 word의 마지막 문자를 word의 길이가 3이 될 때까지 끝에 붙임
    if (word.length <= 2) {
        while (word.length < 3)
        word += word[word.length-1]
    }
    
    return word
}
profile
기록, 꺼내 쓸 수 있는 즐거움

0개의 댓글