[문자열][programmers] 문자열 다루기 기본

Tieck

·

2021. 10. 5. 14:08

문제

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

예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴한다.

https://programmers.co.kr/learn/courses/30/lessons/12918?language=python 

 

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

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

programmers.co.kr

 


 

이해

 

입력

  • s : 길이 1 이상, 길이 8 이하인 문자열

출력

frue

false

 

조건

문자열의 길이가 4 또는 6이고, 숫자로만 구성됨

예시

s return
"a234" false
"1234" true

 

접근

문자열의 isdigit() 함수를 이용하여 문자열 여부를 검사하고 answer에 갱신하면 되겠다.

if- else 문을 이용해 문자열의 길이 제한(4 or 6) 검사를 먼저하고 아니면 false를 반환하고 종료하자.

 

 

구현

 

try #1

채점 결과

정확성: 87.5

합계: 87.5 / 100.0

# 풀이
def solution(s):
    
    # 문자열 길이 검사
    if len(s) > 8:
        answer = False
        return answer
    elif len(s) < 1:
        answer = False
        return answer
    elif s.isdigit():
        answer = True
        return answer
    else:
        answer = False
        return answer
  • 테스트 5,6번 실패
  • 혹시 none , null 처리 때문일까?

 

len()은 NoneType에 사용할 수 없다.

if 문으로 예외처리 하자.

 

 


 

NULL / None / NaN / na 차이가 뭘까?

  • None in python is NULL in other programing language

파이썬은 모든 데이터가 객체, None 역시 NoneType이라는 객체로 구성됨 ,싱글턴으로 동작(오직 하나의 인스턴스만 생성하여 사용)

 

  • NaN

1. Not a Number의 약자 

2. 표현되지 않는 부동소수점 값 (float type in python)

무한대 끼리의 사칙연산 등 NaN이 피연산자로 포함되는 어떠한 연산도 결과는 NaN이다.

 

  • na , N/A , N.A.

1. not avaliable : 이용 불가

2. not Applicable : 해당 없음

데이터를 수집할 때 측정 불가능해서 기록하지 못했거나, 결측치라 이용 공란일 때 사용한다.

측정 불가, 이용 불가, 해당 없음 등 핵심은 분석에 이용하지 못하는 데이터란 의미이다. 적절한 전처리가 필요

 

 

 

 


 

 

try#2

채점 결과

정확성: 100.0

합계: 100.0 / 100.0

def solution(s):
    
    # null 검사
    if s is None:
        answer = False
        return answer
    
    # 문자열 길이 검사    
    if len(s) == 4 or len(s) == 6:       
        if s.isdigit():
            answer = True
            return answer
        else:
            answer = False
            return answer
    else:
        answer = False
        return answer
  • 생각해보니  조건을 지키는 입력값 s가 들어오니까, 한번더 검사를 할 필요가 없다.
  • 검사해야하는 것은 "문자열의 길이"가 4이거나 6인가 이다.
  • null 체크를 안해도 테스트케이스는 통과가 된다....
  • 실행시간 0.00ms 대부분 + 0.01ms * 3

 

 

 


 

코드 리뷰

 

임형섭 외 61명

def alpha_string46(s):
    return s.isdigit() and len(s) in (4, 6)

반해버릴 것 같은 간결한 코드다.

직관적이면서 짧다.

 

try2와 실행시간 비교

 

try#2보다 실행 시간이 좀 더 빠르다.

하지만 입력값이 None Type이라면 에러가 나오는 점이 아쉽다.

 

 

 

 

익명 외 1명

def alpha_string46(s):
    try:
        int(s)
    except:
        return False
    return len(s) == 4 or len(s) == 6

이 코드 역시 간결하고 직관적이다.

그리고 try - except문을 통해 Null 예외처리까지 된다.

 

 

chess

def alpha_string46(s):
    import re
    return bool(re.match("^(\d{4}|\d{6})$", s))
  • 정규분포식을 이용함

^는 문자열의 처음, $은 문자열의 끝

\d는 숫자

\d{4}|\d{6}은 숫자가 4번 or 6번 반복되는 것을 찾는 조건

 

  • Null 처리는 안됨
  • 시간 복잡도가 높은가?

다른 사람의 코드들은 테스트 케이스 1회당 0.00ms이 대부분인데

이 코드의 실행시간은 0.10ms ~ 0.14ms 이다.

프로그래머스에서 컴파일러의 내장 함수는 CPython으로 구현된 듯 싶다.

그래서 내장함수의 속도가 더 빠르다.

 

 

 

 

다른 사람들은 Null 처리를 하라는 조건이 없어서 속도를 위해 생략한 한 것같다.

그래도 예외처리를 습관적으로 하자. 언제 필요할 지 모르기 때문이다.

 

 

 

 

 

 

코드 리뷰는 꼼꼼하게 하자.

 

 

 

Reference

[Python] None, NaN에 대해서 (tistory.com)

 

[Python] None, NaN에 대해서

pandas DataFrame에 None 데이터를 넣으면 NaN 객체로 자동 변환이 된다. from pandas import DataFrame as df a = df([[1,2,3],[4,5,6], [None, 3,4]], columns=['a','b','c'], index=['aa','bb','cc']) a를 출력..

purplechip.tistory.com