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

2024. 8. 19. 18:00코딩테스트 입문

https://school.programmers.co.kr/learn/courses/30/lessons/120864

 

프로그래머스

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

programmers.co.kr


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


제한사항

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

입출력 예

my_string result
"aAb1B2cC34oOp" 37
"1a2b3c4d123Z" 133

입출력 예 설명
입출력 예 #1

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

입출력 예 #2

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

문자열의 숫자를 찾는데, 이전과는 다르게 연속된 숫자들은 하나의 숫자로 취급하는 문제입니다.

이런 문제들을 볼 때마다 split 함수와 정규식을 같이 사용하면 참 좋을 것 같더라고요.

 

re 패키지에서 사용하는 re.split(regex, list)는 regex를 기준으로 리스트를 분리를 해줍니다. 

이 문제같은 경우에는 숫자들과 영대소문자가 섞여있는데, 그러면 영대소문자를 기준으로 분리를 해주면 되겠죠.

 

파이썬으로 문제를 풀어보겠습니다.

import re
def solution(my_string):
    # 영어 문자(대소문자)를 기준으로 분리
    result = re.split('[A-Za-z]+', my_string)

    # 빈 문자열 제거
    result = sum(int(x) for x in result if x)
    return result

정규식을 사용하기 위해 re 패키지를 불러옵니다.

불러온 re 패키지의 split(regex, list) 구조를 사용해서 정규식을 기준으로 my_string을 분리합니다.

 

[A-Za-z]+에서 A-Za-z 1) A부터 Z까지 2) a부터 z까지 를 의미합니다.

[xy]는 x 또는 y를 의미하는데, [A-Za-z]는 영대소문자를 모두 포함하는 걸 의미하죠.

+는 반복을 의미하는데, [A-Za-z]+는 [A-Za-z]가 한 번 이상 반복되는 것을 의미합니다.

한 줄로 요약하자면, 영대소문자가 1글자 이상인 값을 정규식으로 표현한 겁니다.

 

result는 my_string을 regex를 기준으로 분리한 결과입니다.
이 리스트에는 빈 문자열들이 섞여있기 때문에, 빈 문자열들을 제거하고 int로 형변환해줍니다.

형변환된 리스트에 sum을 적용하면 더한 값을 얻을 수 있습니다.

 

연속된 숫자같은 문제들은 숫자가 나왔을 때 뒤의 값이 숫자인지 확인하는 로직으로도 구성할 수 있겠지만, 정규식을 이용하면 더 편하게 풀 수 있습니다.

'코딩테스트 입문' 카테고리의 다른 글

삼각형의 완성조건 (2)  (0) 2024.08.21
안전지대  (0) 2024.08.20
다항식 더하기  (0) 2024.08.18
최댓값 만들기 (2)  (0) 2024.08.17
캐릭터의 좌표  (0) 2024.08.16