우아한 테크캠프에 도전해보고자 코테 연습을 자바스크립트로 하는 중이다. Level 1 문제부터 차근차근 시도하는 중인데, 하필 평소 코테에서 사용해보지 못했던 정규표현식을 활용하는 문제를 만나서 해결하는데 생각보다 오래 걸렸다. 특정 조건을 만족하지 못하는 문자열이 입력으로 주어졌을 때 조건을 만족하도록 문자열을 수정하는 문제이다.


  1. 대문자를 모두 소문자로 치환
  2. 알파벳, 숫자, -
  3. 연속된 마침표 패턴을 모두 하나의 마침표로 치환
  4. 문장의 처음과 끝의 마침표를 삭제
  5. 빈 문장일 경우 “a”로 치환
  6. 문장의 길이가 16 이상일 경우 처음 15글자를 제외한 뒤의 문자 삭제, 만약 15번째 문자가 마침표일 경우 삭제
  7. 문장의 길이가 2 이하일 경우 마지막 문자를 문장길이 3이 될때까지 반복해서 삽입


솔루션

function solution(new_id) {
    let fixed_id = new_id.toLowerCase();
    
    // [^\w-.]으로 기술하는 방식이 더 간단하단 걸 나중에 풀이를 보고 알았다. [^]는 특정 문자가 아닌 패턴을 나타냄.
    fixed_id = fixed_id.replace(/[^a-z0-9-_.]/gi,""); 
    
    // +는 한 번 이상 반복을 나타냄. gi는 문장 전체와 대소문자 구분 없음을 나타냄.
    fixed_id = fixed_id.replace(/.+/gi,".");  
    
    // ^는 문장의 시작, $는 문장의 끝을 나타냄.
    fixed_id = fixed_id.replace(/^.|.$/gi,""); 
    
    // 빈 문자열.
    fixed_id = fixed_id.replace(/^$/gi,"a");
    
    // 문자열의 길이가 16 이상일 때 slice로 앞부분을 자르고 끝의 마침표를 삭제.
    fixed_id = fixed_id.replace(/^.{16,}$/gi,fixed_id.slice(0, 15).replace(/\.$/gi,""));
    
    // 반복문, 조건문 사용 없이 풀고싶어서 코드가 길어졌다. 문자열의 길이가 2 이하일 때 마지막 문자를 repeat으로 반복해서 치환.
    // (3 - fixed_id)에 abs를 적용한 이유는 문자열의 길이가 4이상일 때 음수가 되어 오류가 뜨기 때문
    // 물론 문자열의 길이가 2 이하일때만 해당 치환이 적용되기 때문에 문자열의 길이가 4이상일 때 마지막 글자가 추가되는 일은 없다.
    fixed_id = fixed_id.replace(/^.{0,2}$/gi, fixed_id.concat(fixed_id.charAt(fixed_id.length-1).repeat(Math.abs(3 - fixed_id.length))));
    
    return fixed_id;
}