본문 바로가기

Algorithm

[알고리즘] #17 문자열 다루기 기본 | 프로그래머스

728x90

문자열 다루기 기본 알고리즘이다.

 

https://programmers.co.kr/learn/courses/30/lessons/12918

 

코딩테스트 연습 - 문자열 다루기 기본

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

programmers.co.kr

 

 

 

 


 

문제 설명

 

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

 

 

제한 사항

 

  • s는 길이 1 이상, 길이 8 이하인 문자열입니다.

 

입출력 예

 

 

 

 


 

< 풀이 과정 (실패원인 찾아보기)  >

 

function solution(s) {
    return ((s.length === 4 || s.length === 6) && (isNaN(s)) === false) ? true : false)
}

 

맨 처음에 썼던 코드이다. isNaN 함수를 사용하였다. isNaN은 is not a number이라는 뜻인데, 숫자가 아니면 true, 숫자면 false를 반환해준다. 특이사항은 문자열 안에 '1214124' 이렇게 있더라도 안에 있는 게 숫자면 false를 반환해준다. 따라서 isNaN을 사용해보았는데 아무리해도 test11에 걸리는 것이었다. 테스트11번은 무슨 조건으로 테스트 하는 건지 알고 싶다. 찾아보니 지수형식에 관한 이야기가 있던데 잘은 모르겠지만 다른 사람들도 테스트11로 인해 우여곡절을 겪는 사람이 많아 보인다.

 

 

 

function solution(s) {
    return ((s.length === 4 || s.length === 6) && (isNaN(s.replace(/(\s*)/g, "")) === false) ? true : false)
}

다음으로는, 혹시 공백이 문제가 되는 게 아닐까 해서 공백을 다 지워줘보았다. 하지만 역시 테스트 11번에서 막혔다. 

 

 

 

 


 

< 문제 풀이 >

 

function solution(s) {
    return (s == parseInt(s)) && (s.length === 4 || s.length === 6) ? true : false
}

 

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수

 

문자열 길이가 4 혹은 6이면서 숫자이기도 하면 true, 아니면 false를 반환해준다. 

 

parseInt라는 것과 == 연산자를 이용해 풀었다. parseInt는 문자형을 숫자로 바꿔준다. 그런데 s는 문자형인데 왜 숫자랑 비교를 했을까. ==는 자료형에 상관없이 비교를 해준다고 한다. ==로 비교를 하게 되면 '12' 나 12나 똑같다고 해준다. 그래서 s는 문자형임에도 불구하고 '12'처럼 문자열안에 숫자로 채워져있으면 숫자와 비교해서 같다고 해줄 수 있는 것이다. == 와 === 의 차이점에 대해서 더 정확히 비교한다라고만 알고 있었는데 이번 기회에 좀 더 알게 된 것 같다.

 

 

 


 

 

 

 

다른 사람들은 어떻게 풀었을까?

 

 

https://programmers.co.kr/learn/courses/30/lessons/12918/solution_groups?language=javascript&type=all 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

const solution = s => !!((s.length === 4 || s.length === 6) && !s.includes('e') && s - 0);

인상적인 코드를 가져와봤다. 이분 덕분에 좋은 걸 배웠다. 여기서 주목할 점은 s-0 이라는 부분. 예를들어 s가 '123124'라고 해보자. '123124'라는 문자열에서 숫자 0을 빼주면 알아서 문자를 숫자로 바꾼다음 0을 빼준다. 그럼 123124라는 숫자가 된 것이다. 이렇게 숫자로 변환하는 방법이 있다니 정말 놀랍다. 그리고 또 이 부분. !s.includes('e') 여기서 e가 포함된 것은 제외해주었다. 찾아보니 지수형식이라는 것 같다. test11 때문에 원인 검색을 좀 해봤는데, test11을 통과하지 못한 이유가 지수형식 때문이라는 말도 있었다. 그런데 이 코드에서는 지수형식까지 고려해주었다. 다시보니 !!도 있는데 이건 boolean type으로 바꾸기 위해 쓰신 것 같다. 보면 볼 수록 대단한 코드 같다. 이 코드 한 줄을 통해 많이 배운다.

 

 

 

 

 

 

 

 

 

 

 

참고 (test 11 관련)

문자열 다루기 기본 https://habitual-history.tistory.com/3

 

 

728x90