본 문서는 프로그래머스(programmers.co.kr)에 기제된 카카오 2021년 블라인드 테스트를 기준으로 작성하였습니다.
입력된 계정 id(string)이 조건에 맞지 않은 경우 주어진 프로세스에 따라 올바른 계정 id를 추천해주는 문제입니다.
function isVaildId(id) {
if (typeof id !== 'string'
|| !(id.length >= 3 && id.length <= 15)
|| /[^a-z\d-_.]/.test(id)
|| /^\.|\.$|[.]{2, }/.test(id)
) {
return false;
}
return true;
}
function getRecommendId(id) {
let recommendId = id
.toLowerCase()
.replace(/[^a-z\d-_.]/g, '')
.replace(/\.{2,}/g, '.')
.replace(/^\.|\.$/g, '')
.replace(/^$/, 'a')
.slice(0, 15)
.replace(/\.$/g, '');
if (recommendId.length <= 2) {
const lastChar = recommendId[recommendId.length - 1];
while(recommendId.length <= 2) {
recommendId = recommendId.concat(lastChar);
}
}
return recommendId;
}
function solution(new_id) {
function isVaildId(id) {
if (typeof id !== 'string'
|| !(id.length >= 3 && id.length <= 15)
|| /[^a-z\d-_.]/.test(id)
|| /^\.|\.$|[.]{2, }/.test(id)
) {
return false;
}
return true;
}
function getRecommendId(id) {
let recommendId = id
.toLowerCase()
.replace(/[^a-z\d-_.]/g, '') // 소문자, 숫자, -, _, . 을 제외한 모든 string 제거
.replace(/\.{2,}/g, '.') // .이 2번 이상 반복되는지 확인하여 .으로 바꾼다 이는 .+로 사용하여 1번이상 반복되었을 때로 치환 가능하다.
.replace(/^\.|\.$/g, '') // .으로 시작하거나 끝나는 경우 제거
.replace(/^$/, 'a') // 빈문자열인지 확인하는 방법으로 ^$를 사용할 수 있다.
.slice(0, 15)
.replace(/\.$/g, '');
if (recommendId.length <= 2) {
const lastChar = recommendId[recommendId.length - 1];
while(recommendId.length <= 2) {
recommendId = recommendId.concat(lastChar);
}
}
return recommendId;
}
return isVaildId(new_id)
? new_id
: getRecommendId(new_id)
}
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);
}
id가 유효한지 검증 코드하는 부분을 함수화 하여 사용한 것 외에는 전체적으로 코드 로직이 비슷하다.
이 코드를 보고 배운점은 answer의 길이를 미리 구하고 그에 따라 repeat 메서드를 사용해 마지막 문자값을 반복시키고 덧 붙였다는 점이다.
확실히 while보다는 가독성이 좋은 듯 하며, while을 사용했을 때 무한으로 반복될지도 모른다는 불안함을 해소시켜주는 것 같다.