[문자열][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 : 길이 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)
반해버릴 것 같은 간결한 코드다.
직관적이면서 짧다.
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)
'알고리즘' 카테고리의 다른 글
[문자열][programmers] 문자열 내 마음대로 정렬하기 (0) | 2021.10.05 |
---|---|
[문자열][programmers] 문자열 내림차순으로 배치하기 (0) | 2021.10.05 |
[로드맵] 코딩테스트 학습 개괄 (0) | 2021.10.04 |
[Greedy][programmers]탐욕법 lv1 체육복 (0) | 2021.09.08 |
[Greedy]그리디 알고리즘 (0) | 2021.09.06 |