티스토리 뷰

💡 문제

신규 아이디 추천

 

🔍 분석 및 계획

 문제 이해

문자열을 입력했을 때 주어진 규칙에 따라 변형하는 문제

  • 입력 값 : 문자열
    - 1 <= 문자열길이 <= 1000
    - 알파벳 대문자, 알파벳 솜누자, 숫자, 특수문자로 구성
    - 특수문자는 -_.~!@#$%^&*()=+[{]}:?,<>/ 로 한정
  • 출력 값 : 규칙에 맞게 변형된 문자열

 

문자열 변형 규칙

  1. 모든 대문자를 소문자로 치환
  2. 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자 제거
  3. 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환
  4. 마침표(.)가 처음이나 끝에 위치한다면 제거
  5. 빈 문자열이라면 "a" 대입
  6. 길이가 16자 이상이면, 첫 15개의 문자를 제외한 나머지 문자 모두 제거
    제거 후 마침표(.)가 끝에 위치한다면 제거
  7. 길이가 2자 이하면 마지막 문자를 길이가 3이 될때까지 반복

위 문제는 입력되는 문자열의 길이가 제한되어 있기 때문에 가능한 O(n)이 걸리는 함수들을 활용해서 최대한 깔끔한 식을 목표로 함수를 사용하는 것이 좋을 것 같다

  1. toLowerCase
  2. /[^a-z0-9-_.]/
  3. /\.{2,}/g
  4. /^\.|\.$/g
  5. 길이 ===0
  6. 길이 >=16
  7. 길이 <=2

가능하면 평소에 거의 사용하지 않는 정규식을 이번기회에 사용해보려고 구글링을 열심히 했다

 

 의사코드 작성

function solution(babbling) {
  //각 단계 실행..
}

 

 

📝 코드 구현

최종 코드

function solution(new_id) {
  let answer = new_id.toLowerCase();
  answer = answer.replace(/[^a-z0-9-_.]/g, "");
  answer = answer.replace(/\.{2,}/g, ".");
  answer = answer.replace(/^\.|\.$/g, "");
  answer = answer.length === 0 ? "a" : answer;
  answer = answer.length >= 16 ? answer.slice(0, 15) : answer;
  if (answer.at(-1) === ".") answer = answer.slice(0, -1);
  if (answer.length <= 2) answer += answer.at(-1).repeat(3 - answer.length);

  return answer;
}

시간 복잡도 : O(n)

 

💭 되돌아 보기

 다른 사람 풀이

 

1.
각 단계의 결과값에 계속 다음 단계로 이어 붙여 연결하고 주석으로 어떤 단계인지 설명을 넣었다

function solution(new_id) {
    const answer = new_id
        .toLowerCase() // 1
        .replace(/[^\w-_.]/g, '') // 2
        .replace(/\.+/g, '.') // 3
        .replace(/^\.|\.$/g, '') // 4
        .replace(/^$/, 'a') // 5
        .slice(0, 15).replace(/\.$/, ''); // 6
    const len = answer.length;
    return len > 2 ? answer : answer + answer.charAt(len - 1).repeat(3 - len);
}
 
내코드에서 개선점
  1. 2단계 : \w = [A-Za-z0-9_]
  2. 3단계 : /\.+/g = .한개이상
  3. 5단계 : /^$/ = 빈문자열
  4. 6단계 : replace(/\.$/, '') => 마지막열 . 제거에 정규식 사용

 

2. 

정규식 만으로 작성한 코드 ㄷㄷ

const solution = new_id =>
    new_id.toLowerCase()
          .replace(/[^\w-_.]/g, "")
          .replace(/\.+/g, ".")
          .replace(/^\.|\.$/g, "")
          .replace(/^$/, "a")
          .match(/^.{0,14}[^.]/)[0]
          .replace(/^(.)$/, "$1$1$1")
          .replace(/^(.)(.)$/, "$1$2$2");

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함