https://programmers.co.kr/learn/courses/30/lessons/72410
프로그래머스에서 코딩테스트 연습
규격에 맞지 않는 아이디를 입력했을경우 규칙에 맞게 변경하여 추천하는 기능이다
이 연습으로 정규식을 공부하게된 좋은 경험이였다
내가 제출한 답안
모든것을 함수화하여 만들었다....
function solution(new_id) {
var answer = new_id;
answer = changeLowercase(answer);
answer = removeEtcChar(answer);
answer = removeDoubleDot(answer);
answer = removeSideDot(answer);
answer = isblank(answer);
answer = checkLangth(answer);
answer = removeSideDot(answer);
answer = checkLangthShort(answer);
return answer;
}
// 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
function changeLowercase(id) {
let strArr = id.split('');
let lowcaseStr = strArr.map(el=>{
el = el==el.toUpperCase() ?el.toLowerCase() : el ;
return el;
});
return lowcaseStr.join('');
}
=> 굳이.... 문자를 모두 쪼개어 하나씩 비교하여 소문자로 바꿀필요가.... 없었따.....
그냥
new_id.toLowerCase()
이럼 모든문자 변경이 된다..ㅎ...
8줄->1줄 ㅎㅎㅎ
다른 사람들의 풀이를 보면서 공부가 많이되었다.
이런게 코딩테스트의 묘미!
// 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
function removeEtcChar(id){
let regExp = /[^a-z0-9\-\_\.]/g;
var rst = id.replace(regExp,'');
return rst;
}
=> 여기서부터 정규식 공부하면서 하나하나 적용해 봤다.
String.prototype.replace() : 어떤 패턴에 일치하는 부분이 교체되어 새로운 문자열 반환
/[^a-z0-9\-\_\.]/g
/[^a-z0-9\-\_\.]/g a부터 z까지
/[^a-z0-9\-\_\.]/g 0부터 9
/[^a-z0-9\-\_\.]/g 특수문자-,_,. 를
/[^a-z0-9\-\_\.]/g 제외(^)하고 공백으로('') 치환
=== 다른 사람들의 풀이 ===
/[^\w-_.]/g
/[^\w-_.]/g : a-zA-Z_ ( 영문 대소문자 52개 + 숫자 10개 + _)
/[^\w-_.]/g : -_. : - _ .
/[^\w\d-_.]/g
/[^\w\d-_.]/g : a-zA-Z_ ( 영문 대소문자 52개 + 숫자 10개 + _)
/[^\w\d-_.]/g : 0-9 (숫자)
/[^\w\d-_.]/g : - _ .
/[^a-z0-9\-_.]/g
// 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
function removeDoubleDot(id){
let regExp = /[\.]{2,}/g;
var rst = id.replace(regExp,'.');
return rst;
}
/[\.]{2,}/g
/[\.]{2,}/g : 특수문자 . 이
/[\.]{2,}/g : 2개이상 연속적으로 일치할 경우
=== 다른사람들의 풀이 ===
.replace(/\.\.+/g, '.')
.replace(/\.+/g,".")
.replace(/[.]+/g, ".");
// 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
function removeSideDot(id){
let regExp = /^\.|\.$/g;
var rst = id.replace(regExp,'');
return rst;
}
/^\.|\.$/g
/^\.|\.$/g : 문자 첫번째에 . 이 있을경우
/^\.|\.$/g : 이거나
/^\.|\.$/g : 문자 마지막에 . 이 있을경우
// 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
function isblank(id){
let rst = id.length == 0 ? 'a':id;
return rst;
}
length가 0이면 a, 아니면 가져온 id
=== 다른사람들의 풀이 ===
.replace(/^$/, 'a') : 시작이 끝일경우! 크으으으 o_ob
.padEnd(1,'a') : 1번째 문자열을 a로 변환! 크으으으으으 o_ob
String.prototype.padEnd();
: 현재 문자열에 다른 문자열을 채워 주어진 길이를 만족하는 새로운 문자열을 반환
var text ='일이삼사오육';
text.padEnd(10,'*'); // "일이삼사오육****"
// 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
function checkLangth(id){
let rst = id.substring(0,15);
return rst;
}
=== 다른사람들의 풀이 ===
.slice(0, 15)
answer.substr(0,15);
.match(/^.{0,14}[^.]/)[0]
String.prototype.match()
: 문자열이 정규식과 매치되는 부분 검색
// 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
// 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
function checkLangthShort(id){
var lastStr = id.substr(id.length-1, 1);
var rst = '';
if(id.length <3) rst = id + lastStr.repeat(3-id.length);
return id + rst;
}
=== 다른사람들의 풀이 ===
const len = answer.length;
return len > 2 ? answer : answer + answer.charAt(len - 1).repeat(3 - len);
.padEnd(3, id[id.length-1])
'STUDY > 코딩테스트 문제풀이' 카테고리의 다른 글
[프로그래머스] 코딩테스트 문제풀이 (신고 결과 받기) (0) | 2022.08.22 |
---|