-
항해 99 - 문자열 다루기 기본알고리즘 공부/JavaScript 문제 2023. 4. 16. 22:25
[ 문제 ]
문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. \
예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.
- s는 길이 1 이상, 길이 8 이하인 문자열입니다.
- s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.
[ Input / Output 예시 ]
Input Output "a234" false "1234" true
[ 풀이 ]
보자마자 이건 정규식이면 한줄로 끝낼 수 있겠다. 생각했지만 정규식을 어렵다고 생각이 들어서 뒤로 미뤘다.
우선은 2개의 조건(문자열 길이, 숫자로만 구성)을 만족시켰다고 생각했는데, 계속 틀려서 이해할 수 없었다.
// 내가 짰던 기존의 코드 // ((길이가 4인가?) 또는 (길이가 6인가)) 그리고 문자열이 숫자로만 구성되어있는가? // const solution1 = function (s) { return ((s.length===4) || (s.length===6)) && !isNaN(Number(s)) ? true : false; } console.log(solution1('1234')); // true console.log(solution1('"a234"')); // false
예시도 맞추고 아무리 읽어도 맞는데... 뭐가 문제일까?? 생각하다가 프로그래머스에서 제공하는 힌트가 있어서 확인했다.
정말 생각지도 못했던 지수형이 나타났다! 10e1, 1E31 이런 식의 지수형을 숫자로 인식하는 것이었다.
곰곰히 생각해보다가 2가지 방식으로 풀어보았다.
풀이 (1)
문자 하나하나 for문으로 확인하면서 문자면 false를 반환한다.
통과한 문자열도 길이에 대한 조건이 있으므로 삼항연산자를 활용해서 걸러준다.
풀이 (2)
역시나 처음에 생각하고 미뤄뒀던 정규식이다.
.test() 메소드를 사용하면 정규식 만족하면 true, 만족하지 못하면 false를 반환했다.
내가 생각했던 다른 메소드랑 조금 다르다면 정규식에 사용하는 메소드라는 것이다.
문자열.test(정규식) 형태가 아니라 정규식.test(문자열) 형태이다.
정규식 문제가 나타나면 피하지말고 바로 해보자고 다짐하게 하는 문제였다.
[ 코드 ]
// 풀이 (1) // 그렇다면 e가 하나 들어간 문자열을 제외할 수 있도록 하나씩 for 문으로 검사해보자. const solution2 = function (s) { // 문자열을 하나하나 검사해보자. for (ch of s) { // 숫자가 아닌 문자일 때 false를 반환한다. if (ch<'0' || ch>'9') { return false; } } // 길이가 4이거나 6일 때만 true, 아니면 false return ((s.length===4) || (s.length===6)) ? true : false; } console.log(solution2('1345')); // true console.log(solution2('10e1')); // false // 풀이 (2) // 이번엔 정규식으로 해보자. // 사실 정규식이 너무 어려워서 제일 먼저 생각나도 계속 뒤로 미룬다.... 정신차려ㅠ // .test() 메소드를 사용하면 정규식을 만족하면 true 만족하지 못하면 false를 반환한다고 한다. const solution3 = function (s) { const regExp = /^\d{6}$|^\d{4}$/ return regExp.test(s); } console.log(solution3('1345')); // true console.log(solution3('10e1')); // false
'알고리즘 공부 > JavaScript 문제' 카테고리의 다른 글
항해 99 - 완주하지 못한 선수 (1) 2023.04.17 항해 99 - 수박수박수박수박수박수? (1) 2023.04.17 항해 99 - 서울에서 김서방 찾기 (0) 2023.04.16 항해 99 - 문자열 내 p와 y의 개수 (0) 2023.04.16 항해 99 - 내적 (0) 2023.04.16