-
[프로그래머스] [신규 아이디 추천] 정규식이 누군지 알았다면 쉽게 풀었을텐데 - JSProblem Solving 2021. 2. 16. 17:44
[^a-z]
이게 무슨 뜻인지 알면 이 포스트를 볼 필요 없어요! 뒤로가기를 누르세요 back back~~
programmers.co.kr/learn/courses/30/lessons/72410#
아래는 성공은 했으나 우아하지는 않은 코드, 일일히 단계를 구현하여 풀었다.
으악 내눈... 내 손목... 저처럼 이렇게 고생하면서 풀지 마세요function len(new_id){ // python을 하다가 js를 해서 헷갈려서 func을 아예 만들었다 return new_id.length; } function step1(new_id){ // to lower case return new_id.toLowerCase(); } function step2(new_id){ // working var regExp = /[\{\}\[\]\/?,;:|\)*~`!^\+<>@\#$%&\\\=\(\'\"]/gi; if(regExp.test(new_id)){ new_id = new_id.replace(regExp, ''); // 찾은 특수 문자를 제거 } return new_id; } function step3(new_id){ // not working new_id = new_id.replace(/[.]+/g,".") return new_id; } function step4(new_id){ if(new_id[0]=='.'){ // working new_id = new_id.slice(1) } if(new_id.slice(-1)=='.'){ // working new_id = new_id.slice(0,-1) } return new_id; } function step5(new_id){ if(!len(new_id)){ return 'a'; }else{ return new_id; } } function step6(new_id){ if(len(new_id)>15){ new_id = new_id.slice(0,15); } new_id = step4(new_id); return new_id; } function step7(new_id){ while(len(new_id)<3){ new_id+=(new_id.slice(-1)); } return new_id; } function solution(new_id) { var answer = ''; answer = step1(new_id); answer = step2(answer); answer = step3(answer); answer = step4(answer); answer = step5(answer); answer = step6(answer); answer = step7(answer); return answer; }
다른 사람들은 어떻게 풀었을까? 싶어 구글링을 해보니
고작 10줄???? 안에 푼 코드들이 있었다ㅠㅠ
우아한 코드와 내 코드의 차이점은 바로
replace
정확히는 replace 안에 들어가는 정규식!
정규식을 사용하면 우아해진다~!
function solution(new_id){ var ans = ""; ans = new_id .toLowerCase() .replace(/[^a-z-_.0-9]/g,'') .replace(/[.]+/g,'.') .replace(/^[.]|[.]$/,'') .replace(/^$/,'a') .slice(0,15) .replace(/[.]$/,''); while(ans.length<3){ ans+=ans.slice(-1); } return ans; }
.toLowerCase() // 1단계
대문자들을 소문자로 바꿔준다
replace 에서 정규식 쓰는 법을 한 단계씩 살펴보자!
기본 틀 -> replace(/찾는 것/범위,'')
.replace(/[^a-z-_.0-9]/g,'') // 2단계
[^a-z-_.0-9]: a~z, -, _, ., 0~9 이외의 문자를 찾음
g: 검색범위를 전역으로
[a-z]: a~z 사이의 문자를 찾음
[^a-z]: a~z 외의 문자를 찾음
[-_.]: - _ . 를 찾음
[0-9]: 0~9 사이의 문자를 찾음
[a-z-_.0-9]: a~z, -, _, ., 0~9인 문자를 찾음
.replace(/[.]+/g,'.') // 3단계
[.]+: .이 하나 이상인 경우를 찾음
[.]: . 을 찾음
+: 앞 문자가 하나 이상임
.replace(/^[.]|[.]$/,'') // 4단계
^[.]|[.]$: 문자열 처음과 끝에 있는 .을 찾음
^: 문자열의 시작 (^은 [ ] 안에서 쓰일 때와 [ ] 밖에서 쓰일 때 다르니 주의)
$: 문자열의 종료
| : or
^[.]: 문자열 시작에 있는 . 을 찾음
[.]$: 문자열 끝에 있는 .을 찾음
.replace(/^$/,'a') // 5단계
^$: 문자열이 비어 있다면 처음과 끝은 같다
.slice(0,15) // 6단계
문자열의 0번째 element부터 15번째 element까지만 취함
.replace(/[.]$/,''); // 6단계
[.]$: 문자열 끝에 있는 .을 찾음
'Problem Solving' 카테고리의 다른 글
[프로그래머스] [오픈채팅방] 어피치님이 들어왔습니다. JavaScript (0) 2021.02.22 [프로그래머스] 만만할 줄 알았던 피보나치 수 JS (0) 2021.02.09 [JavaScript] 메뉴 리뉴얼 JS (0) 2021.02.03 [JavaScript] 올바른 괄호 (0) 2021.02.03