기업 출제 문제로 게시할 수 없음.
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;
}- 문제를 푸는 단계는 이미 지문에 제시되어 있다. 따라서 이번 문제는 해당 언어로 문자열 및 정규식을 얼마나 잘 다루는지를 알아보기 위한 문제일 것이다.
- 자바스크립트의 문자열 객체 메소드로 해결할 수 있는 단계는 메소드를 활용하고, 그것보다 복잡한 단계는 정규식 +
replace()메소드 사용을 고려한다.
- 모든 대문자를 소문자로 치환하는 과정은
ioLowerCase()로 구현한다. - 소문자 알파벳, 마침표, 빼기, 밑줄 문자를 제외한 모든 특수문자는 제거해야 한다. 정규식의 Negative lookahead를 사용해 사용 가능한 모든 문자 집합을 매칭에서 제외시킨 후, 아무 한 글자(.)를 매치하게 하면 아이디에 사용할 수 없는 문자만 매칭될 것이다.
replace()메소드로 해당 문자들을 모두 빈 문자열로 바꾼다..이 두 번 이상 반복되면 안 되므로, 정규식의 수량자를 사용해.이 두 번 이상 반복될 경우를 매치하여 빈 문자열로 바꾼다..이 아이디의 맨 앞이나 끝에 오면 안 된다. 이는 앞과 끝에 오는 경우를 정규식의 OR 연산자로 묶어 빈 문자열로 교체한다.- 삼항연산자를 사용해 아이디가 빈 문자열이라면 아이디 대신 "a"를 집어넣고, 아니라면 아이디를 그냥 반환한다.
- 만약 아이디의 길이가 15자를 넘는다면 15자에서 아이디를 잘라야 한다.
slice()로 14번째 인덱스까지 아이디에 포함되게 한다. 이 작업 후 만약 15번째 글자가.인 경우에는 제거한다. - 여기서 아이디의 길이가 3 이상일 경우 바로 아이디를 반환한다.
- 길이가 3 미만일 경우 아이디의 마지막 문자를 아이디의 길이가 3 이상이 될 때까지 아이디 뒤에 붙인다.
- 최종적으로 아이디를 반환한다.
- 일련의 처리 과정들을 메소드 체이닝으로 만들 생각을 미쳐 못 했다.
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(). 문자열의 길이가 인자로 받은 수보다 작다면 부족한 만큼 특정 문자를 해당 문자열 뒤에 이어붙인다.