1단계 newid의 모든 대문자를 대응되는 소문자로 치환합니다.
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(), 마침표(.)를 제외한 모든 문자를 제거합니다.
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
처음으로 코드테스트에 성공한 코드였는데 유효성 검사에서 2개의 빨간불이 들어왔다..(대체 why??)
이유를 찾기위해 이것저것 코드를 건들여보고 왠만한 문제는 풀리면 유효성도 쉽게 넘어갔는데 처음이라 단순하게 마지막쯤 코드가 문제인가 싶어서 level7에서 열심히 코드를 다듬고 너무 복잡한 연산은 쉽게도 풀어보고 열심히 디버깅을 하다가 결국 문제를 풀어낸 방법은
.
.
.
function solution(new_id) {
let lower = new_id.toLowerCase()
let level2 = lower.match(/[a-z0-9-_.]/g).join('')
let level3 = level2.replace(/\.+/g,'.')
let level4 = level3.replace(/^\.|\.$/g,'')
let level5 = level4.length === 0 ? 'a' : level4
let level6 = level5;
if (level5.length >= 16){
level6 = level5.slice(0,15).replace(/\.$/g,'')
}
if (level5.length <= 2){
let small = [...level5].pop().repeat(3-level5.length)
level6 += small
console.log(small)
}
return level6;
}
위의 코드와 차이점이라면 level5단계의 연산이 가벼워 졌다는것이다 실제로 이게 문제였고..
문제에서는 'num_id'에 빈값이라면 'a'를 리턴해라 라고 나와있지만 실제 문제에서
이렇게 나와있어서 입력값의 길이만큼 a를 리턴해주는 코드를 구현하다 보니 윗코드에서 코드가 좀 길어졌는데 이게 웬걸...그냥 a한개만 리턴해도 정답 처리가 되었고 실제 유효성문제도 이코드에서 나왔었다...(문제를 제대로 내주세요...^^)
물론 aaa가 리턴되도 유효성에 막히지않는 좋은 코드를 짤 수도 있었겠지만 문제의 정답대로 풀다보니 'a'만 리턴했고 그결과 정답도 맞았고 유효성에서도 통과되었다😎
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);
}
가장 좋아요가 많던 사람의 코드인데 체이닝과 삼항조건문,정규식을 사용해 심플한 코드를 구현해놓았더라..😱
글을 마치며..
카카오 문제라서 지레 겁을 먹고 시작했는데 풀고나서 보니 그렇게 어렵진 않았다 (진심..?)
다만 오랫만에 쓰고 잘안쓰던 정규식이나 배열메소드들을 찾아보며 사용하니 길고 연산이 오래걸리던 코드들도 간결하고 쉽게 해결이 되었던 부분에서 아직 내가 모르는게 많구나 라는 생각을했다.
앞으로 적재적소에 알맞는 코드를 구현해 문제를 풀어가는 개발자가 되어야겠다고 오늘도 다짐해본다✊🏻