DataScience

[LV0] 숨어있는 숫자의 덧셈 (2) - Python 본문

Coding Review/programmers

[LV0] 숨어있는 숫자의 덧셈 (2) - Python

다크미라클 2022. 10. 10. 14:50

 

[LV0] 숨어있는 숫자의 덧셈 (2)


문제 설명

문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어있습니다. my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.


제한 사항

  • 1 ≤ my_string의 길이 ≤ 1,000
  • 1 ≤ my_string 안의 자연수 ≤ 1000
  • 연속된 수는 하나의 숫자로 간주합니다.
  • 000123과 같이 0이 선행하는 경우는 없습니다.

입출력 예#1

"aAb1B2cC34oOp"안의 자연수는 1, 2, 34 입니다. 따라서 1 + 2 + 34 = 37 을 return합니다.


입출력 예#2

"1a2b3c4d123Z"안의 자연수는 1, 2, 3, 4, 123 입니다. 따라서 1 + 2 + 3 + 4 + 123 = 133 을 return합니다.


입출력 예시 


풀이 및 코드 리뷰

내가 제출한 답 (오답)

import re

def solution(my_string):
    answer = list(map(int, re.findall(r'\d+', my_string)))
    return sum(answer)

 

  • 처음에 숫자를 isdigit으로 구분하는것 까지는 할수 있었으나 2자리 숫자 이상부터는 어떻게 해야될지 감이 안와서    정규표현식으로 한번 해볼 결과 잘 구동하는것을 확인 할수 있었다. 하지만 정규표현식을 사용해본적이 없어서 한번더 공부가 필요하다. 

다른 사람의 풀이1 (정규표현식 사용)

import re

# 1번 방법
def solution(my_string):
    answer = list(map(int, re.findall(r'\d+', my_string)))
    return sum(answer)

# 2번 방법
def solution(my_string):
    return sum([int(i) for i in re.findall(r'[0-9]+', my_string)])
  • re 모듈을 사용하여 정규표현식을 사용하였다.
  • re 모듈중  모든 매치를 찾아 리스트로 변환하는 findall 함수를 사용하였으며
  • 매치의 경우 모든 숫자를 표현하는 r"[0-9]+"의 방식과 r"\d+" 2가지 방식이 존재한다.
  • 최종적으로 각 문자를 더해주기 위하여 리스트 컴프리 헨션 방식을 사용하여 더해주거나
  • map을 사용하여 int로 만들고 list로 바꾼 다음 합치는 방식이 존재한다. 

다른 사람의 풀이2 (리스트 컴프리헨션  / isdigit() 사용)

# 1번 방법 
def solution(my_string):
    s = ''.join(i if i.isdigit() else ' ' for i in my_string)
    return sum(int(i) for i in s.split())
    
# 2번 방법
def solution(my_string):
    my_string = ''.join([s if s.isdigit() else ' ' for s in my_string])
    return sum(list(map(int, my_string.split())))
  • 이 방식의 경우 처음에 생각했던 방식이였으나 if else을 리스트 컴프리 헨션에서 어떻게 사용할지 몰라서 일단 보류했던 방식이다. if else를 리스트 컴프리헨션에 사용하려면 [True if 조건 else False for i in ㅇㅇ]와 같은 방식을 사용해야 한다. 

참고 자료

1. 정규표현식 : 특정한 규칙을 가진 문자열의 집합을 표현하는 형식 언어

nachwon님의 정규표현식에 대한 더 자세한 설명과 예시가 있으니 확인 

 

[Python 문법] 정규표현식 (Regular Expressions)

정규표현식에 대해 알아보고 Python으로 정규표현식을 사용하는 방법에 대해 알아본다.

nachwon.github.io

 

3. if-else 방식의 리스트 컴프리헨션

  •  if문은 for문의 오른쪽, if-else문은 for문의 왼쪽에 사용한다는 점
a = [1,2,3,4,5,6,7,8]

a = [i if i >= 5 else 0 for i in a]
a
>>> [0, 0, 0, 0, 5, 6, 7, 8]

3. isidgit() 

  •  "문자열".isdigit() : 숫자로만 이루어져있다면 True, 숫자로만 이루어져 있지 않다면 False
  • 0과 양의 정수만 확인이 가능하며 음수와 실수는 확인이 불가능하다.
str_num = "12345"
str_alpha = "abcde"

str_num.isdigit()
>>> True

str_alpha.isdigit()
>>> False