첫 풀이
문자열 S의 길이는 4 또는 6이며, 문자열이 "only" 숫자로만 구성되었는지
Boolean
타입으로 나타내는 문제이다.
마침 얼마전 강의에서 JS 정규식
에 대해서 배웠는데,
위의 문제에서 우선적으로 숫자가 연속적인지를 확인하는 방법을 정규식
을 통해서 한번 해결해보기로 했다.
const solution = (s) => {
let answer = false;
if(s.length === 4 || s.length === 6){
if(s.match(/\d{4}/g)){ // 숫자 4자리가 일치하는지 정규식으로 확인
return !answer;
}
}
return answer;
}
위와같이 코드를 작성했고, 이제 확인해보도록 하자.
내가 한가지 간과하고 있었던 점이 있었다..
처음에 문제를 읽고
'아 숫자가 4자리만 연속으로 있으면 True를 반환하면 되는건가?'
라고 잘못 이해한 상태에서 문제를 푸는 과오를 범했다..
4자리 문자열에서는 당연히 1234
와 같은 케이스는 통과하지만,
6자리 문자열에서는 aa1234
와 같이 중간에 문자가 포함되는 반례가 존재했는데, 이부분을 간과했던 것이다.. ㅠㅠ
그래서 문자열이 존재하는지 여부를 판단하는 조건문을 한가지 더 추가해서 코드를 수정했다.
const solution = (s) => {
let answer = false;
if(s.length === 4 || s.length === 6){
if(s.match(/[a-z]{1,}/gi)){ // 문자를 1개 이상 포함하는지
return answer;
}
if(s.match(/\d{4}/g)){ // 숫자 4자리가 일치하는지
return !answer;
}
}
return answer;
}
사실 두번째 조건문에서 숫자가 4자리 이상인지if(str.match(/\d{4,}/g)){
으로 표현하는것이 직관적으로는 올바르나,
생각해보면 이미 문자열에 문자가 존재하지 않는다는 조건문을 거친 이상
4개 연속으로 일치하던, 4개 이상으로 일치하던 정답을 추론하는데 있어서는
크게 문제되지 않는것을 알 수 있었다.