프로그래머스)문자열 다루기 기본

minji jeon·2022년 7월 17일
0

알고리즘

목록 보기
11/29
post-thumbnail

1. 문제

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.
s는 길이 1 이상, 길이 8 이하인 문자열입니다.

2. 접근

솔찍히 이딴 하 문제를 어떻게 접근해야 할지 몰라 열라고민했다...ㅜㅜㅜ
문제를 한번 풀고나서 다시보는 지금도 어케했지..? 생각이 나질않ㄴ느다....쓰읍...
우선 조건이 들어있으니 가장 접근하기 쉬운 if문부터 시작해보자
if 문으로 string의 length를 필터링해준뒤
문자열인지 필터링을 해줘야하는데
숫자열로만 구성되어 있는지 확인할수 방법이 뭐가 있을까 하다가
숫자인지 구별하는법을 구글링해보니
isNaN 함수를 알게되었다.

isNaN 함수는
어떤 값이 NaN인지 판별한다
주어진 값이 NaN이면 true, 아니면 false를 반환한다.

자그럼이제
써볼까

3. 내답

function solution(s) {
    
    let answer = s
    if (answer.length===4 || answer.length ===6){
        if(!isNaN(answer)) {
            return true
        } else return false   //2
    } else return false  //1
    
}
  1. 우선 첫번째 if문에서 조건에 충족되지 않을시 false가 출력되도록
  2. 두번째 if문에서 조건에 충족되지 않을시 false가 출력되도록
  3. 그리고 첫번째, 두번째 조건 모두 충족시 true가 출력되도록 하였는데
    뭔가 이상하긴 한데
    테스트에 통과하고
    제출을 하였더니 하나의 케이스에서 실패가 떴다.
    도무지 감이안와서 q&a를 찾아보니

    그이유는해당 문자열의 숫자를 있는 그대로 출력한다.
    문자열 내에 숫자 말고도 문자가 섞여있으면 무조건 NaN로 나온다.
    예를들어 isNaN(1b124) --> false 즉 숫자로 인식한다.

따라서 paresInt 함수를 사용하면 된다고 하는데
내가 아는 parseInt함수는 정수로 만들어주는함수인데 a1234면 1234만 출력되지 않을까 생각했는데 잘못알고 있었다.

let result = parseInt(a234) // null

문자가 들어있으면 null이 출력된다.

let a = '1e23'
let result = parseInt(a) // 1

대충감이온다. 첫번째문자열부터 숫자만 걸러주고, 문자열은 잘라버린다.

let b = '123e'
let result = parseInt(b) //123

따라서 코드를 다시짜보면

function solution(s) {
 let result = parseInt(s);

 if (s.length === 4 || s.length === 6){
   result = true;
 } else {
   result = false;
 }
 return result;
}

우선 입력값을 정수로 만들어준다. parseInt 함수의 특징으로 문자열이 들어간 입력값은 조건에 부합하지 못하게 될것이다.
if문 조건에 부합하지 않을 경우 false가 출력된다.

  1. 새로운 답
function solution(s) {
    if(s.length === 4 || s.length === 6){
      return s.split("").every((e)=> isNaN(+e) === false)  
    } else {
        return false
    }
}

이전 답과 비슷하게 if문을 사용하지만 방법이 조금 다르다.
length로 길이조건을 먼저 준뒤
split으로 배열을 만들어준다.
그배열을 every함수로 검사를 해주게 된다.

every 함수는 배열의 모든 요소가 callbackFunction 에서 true를 리턴해야 true를 리턴한다, 하나라도 false가 떨어지면 false를 리턴합니다.
구문은 filter, map과 같다.
every나 some 함수의 경우 배열내 값이 존재하는지 확인할때나 조건에 맞는(혹은 맞지 않는) 값이 있는지 확인 할 때 등 활용이 가능하다.
예시> jbAry2.every( function( x ) { return x > 4 }

따라서
배열안에 있는 모든 요소에 isNaN을 해주는데 이때
(문자열)에 +를 붙여서 숫자로 만들어준다.
숫자 모습을 한 문자열 (1,2,3 등..) 에 숫자를 더하면 숫자가 된다.
근데 여기서 문자열에 숫자를 더하면 ****NaN이 된다.
every 함수를 통해 모든 원소가 NaN이 아닐 경우 (모두 찐 숫자인) true, 하나라도 있으면 false 반환하게 된다.

4. 새로 배운 함수

parseInt --> 앞에서부터 정수만 반환
every --> 배열내 모든 요소가 true를 반환해야 true--> 배열내 값이 존재하는지 확일할때나 조건에 맞는지 확인할때 가능

profile
은행을 뛰쳐나와 Deep Dive in javascript

0개의 댓글