코드 1 - isalpha() 사용
def solution(my_string):
for i in my_string:
if i.isalpha():
my_string = my_string.replace(i, ' ')
my_string = my_string.split()
return sum(list(map(int, my_string)))
소문자, 대문자, 자연수로 구성된 문자열에서 숫자들의 합을 구하는 문제이다.
"aAb1B2cC34oOp" 이런 식으로 문자열이 주어지면 숫자인 1 + 2 + 34의 합인 37을 구하는 것이다.
숫자를 찾기 위해 isdigit()을 사용할 수도 있지만, 원본 문자열은 그대로 두되 숫자만 남기는 방식을 택하였다.
그래서 알파벳인지 판별하는 isalpha()를 사용하였다. isalpha()는 대소문자 관계없이 알파벳인지를 판별하는 함수이다.
알파벳이면 해당 문자의 자리를 공백(' ')으로 바꿔주고, 모든 알파벳을 공백으로 바꿨으면 전체 문자열을 공백을 기준으로 분리한다.
그러면 문자열에서 숫자만 남게 되는 것이다.
합을 구하기 위해 정수형으로 바꿔준 뒤, sum()을 이용하여 전체 합계를 구해 리턴해주었다.
코드 2 - re 라이브러리 + 정규표현식 사용
import re
def solution(my_string):
num = re.findall(r'\d+', my_string)
num = list(map(int, num))
return sum(num)
문자열의 길이가 길어지면 for문의 시간도 길어지기 때문에 어떻게 하면 조금 빠르게 할 수 있을지 생각해 보다 정규표현식이 떠올랐다.
re 라이브러리의 findall()은 주어진 패턴에 해당하는 내용들만 리스트로 만들어 준다.
34처럼 연속되는 숫자가 있으면 3, 4와 같이 각각의 수가 아닌 34라는 하나의 수로 인식해야 하기 때문에 1번 이상 반복되는 정수를 의미하는 r'\d+'를 패턴으로 작성해 주었다.
그다음에는 1번 코드와 같은 방식으로 문자열인 숫자를 정수형으로 바꿔준 뒤, sum()을 이용하여 전체 합계를 리턴해주었다.
반응형