Skip to content

Latest commit

 

History

History
86 lines (65 loc) · 4.73 KB

File metadata and controls

86 lines (65 loc) · 4.73 KB

카카오: 신규 아이디 추천

프로그래머스

문제

기업 출제 문제로 게시할 수 없음.

첫 번째 풀이

function solution(new_id) {
  new_id = new_id.toLowerCase();
  new_id = new_id.replace(/(?![a-z0-9.\-_])./g, "");
  new_id = new_id.replace(/\.{2,}/g, ".");
  new_id = new_id.replace(/^\.|\.$/, "");
  new_id = new_id ? new_id : "a";
  new_id = new_id.slice(0, 15).replace(/\.$/, "");

  if (new_id.length > 2) return new_id;

  const lastChar = new_id.charAt(new_id.length - 1);
  while (new_id.length < 3) new_id = new_id.concat(lastChar);

  return new_id;
}

기본 전제

  1. 문제를 푸는 단계는 이미 지문에 제시되어 있다. 따라서 이번 문제는 해당 언어로 문자열 및 정규식을 얼마나 잘 다루는지를 알아보기 위한 문제일 것이다.
  2. 자바스크립트의 문자열 객체 메소드로 해결할 수 있는 단계는 메소드를 활용하고, 그것보다 복잡한 단계는 정규식 + replace() 메소드 사용을 고려한다.

풀이 과정

  1. 모든 대문자를 소문자로 치환하는 과정은 ioLowerCase()로 구현한다.
  2. 소문자 알파벳, 마침표, 빼기, 밑줄 문자를 제외한 모든 특수문자는 제거해야 한다. 정규식의 Negative lookahead를 사용해 사용 가능한 모든 문자 집합을 매칭에서 제외시킨 후, 아무 한 글자(.)를 매치하게 하면 아이디에 사용할 수 없는 문자만 매칭될 것이다.
  3. replace() 메소드로 해당 문자들을 모두 빈 문자열로 바꾼다.
  4. .이 두 번 이상 반복되면 안 되므로, 정규식의 수량자를 사용해 .이 두 번 이상 반복될 경우를 매치하여 빈 문자열로 바꾼다.
  5. .이 아이디의 맨 앞이나 끝에 오면 안 된다. 이는 앞과 끝에 오는 경우를 정규식의 OR 연산자로 묶어 빈 문자열로 교체한다.
  6. 삼항연산자를 사용해 아이디가 빈 문자열이라면 아이디 대신 "a"를 집어넣고, 아니라면 아이디를 그냥 반환한다.
  7. 만약 아이디의 길이가 15자를 넘는다면 15자에서 아이디를 잘라야 한다. slice()로 14번째 인덱스까지 아이디에 포함되게 한다. 이 작업 후 만약 15번째 글자가 .인 경우에는 제거한다.
  8. 여기서 아이디의 길이가 3 이상일 경우 바로 아이디를 반환한다.
  9. 길이가 3 미만일 경우 아이디의 마지막 문자를 아이디의 길이가 3 이상이 될 때까지 아이디 뒤에 붙인다.
  10. 최종적으로 아이디를 반환한다.

제출 코드에서 개선할 점

  • 일련의 처리 과정들을 메소드 체이닝으로 만들 생각을 미쳐 못 했다.
  • while문으로 구현한 마지막 처리 과정을 문자열의 repeat 메소드를 사용해 더 짧게 구현할 수 있을 것이다.

두 번째 제출 코드

function solution(new_id) {
  new_id = new_id
    .toLowerCase()
    .replace(/(?![a-z0-9.\-_])./g, "")
    .replace(/\.{2,}/g, ".")
    .replace(/^\.|\.$/, "")
    .padEnd(1, "a")
    .slice(0, 15)
    .replace(/\.$/, "");

  return new_id.padEnd(3, new_id.charAt(new_id.length - 1));
}

개선점

  • 메소드 체이닝을 통해 재할당문을 반복하지 않아도 된다.
  • 아이디가 빈 문자열이라면 'a'를 넣는 과정을 삼항연산자 대신 padEnd() 메소드로 구현했다.
    • padEnd(1, "a")이므로 아이디가 1자를 넘으면 원래 아이디를 유지한다.
    • 1자를 넘지 못하면 a로 대체된다.
  • 아이디의 길이가 3글자 미만일 때 마지막 글자를 아이디 뒤에 반복해서 붙이는 작업도 padEnd를 사용해 구현했다.
    • 길이가 3자 이상인 아이디는 그대로 반환한다.
    • 3자 미만일 경우, padEnd를 통해 아이디 뒤에 같은 문자열을 추가해 3자가 되게 만든다.
    • 이때 추가하는 문자열은 new_id 문자열의 마지막 문자로 한다.

배운점

  • 문자열 처리는 코테부터 시작해서 현업까지 개발자가 갖추어야 할 필수 덕목인 듯. 자바스크립트 문자열 처리 관련 메소드 뿐만 아니라 정규식 공부도 정규식이 필요한 기출 나올 때마다 해야겠다.
  • (?!pattern)을 정규식 앞에 붙여 해당 패턴은 매칭에서 미리 제외할 수 있다.
  • pattern{최소 반복 횟수,}와 같이 정규식의 수량자를 사용해 해당 패턴이 특정 횟수 이상으로 반복되는 부분을 찾을 수 있다.
  • pattern1|pattern2 정규식 OR 연산.
  • 자바스크립트 String 메소드 padEnd(). 문자열의 길이가 인자로 받은 수보다 작다면 부족한 만큼 특정 문자를 해당 문자열 뒤에 이어붙인다.