개발일기

#5 프로그래머스 크기가작은부분문자열/모음제거(re.sub 개념)/숨어있는숫자의덧셈 본문

오류 및 알고리즘정리본

#5 프로그래머스 크기가작은부분문자열/모음제거(re.sub 개념)/숨어있는숫자의덧셈

츄98 2023. 4. 19. 08:50

1. 크기가 작은 부분 문자열 (이건 페어프로그래밍으로 푼 풀이라서..! 정리한다~)

숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서,
이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.

예를 들어, t="3141592"이고 p="271" 인 경우, 
t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.

 

# 크기가 작은 부분 문자열
def solution(t, p):
     forcount=len(t)-len(p)+1
     count = 0
     for i in range(forcount):
         if t[i:i+len(p)] <= p:
              count += 1
     print(count)

 

 

2. 모음제거

영어에선 a, e, i, o, u 다섯 가지 알파벳을 모음으로 분류합니다. 문자열 my_string이 매개변수로 주어질 때 모음을 제거한 문자열을 return하도록 solution 함수를 완성해주세요.

 

# 모음 제거
def solution(my_string):
     for i in ['a','i','e','o','u']:
         my_string = my_string.replace(i,'')
     return my_string

# 다른 사람 풀이
def solution(my_string):
    return "".join([i for i in my_string if not(i in "aeiou")])


def solution(my_string):
    A = ['a','e','i','o','u']
    answer = ''
    for i in my_string:
         if i not in A:
             answer += i
    return answer


import re
def solution(my_string):
    answer = re.sub("a|e|i|o|u", "", my_string)
    return answer

 

re.sub 사용법

더보기

그 전에, re가 무엇인지 알아보자.

re는 regular expression의 약자로 정규표현식을 의미한다.

python의 re 라이브러리에는 sub라는 메소드가 존재하고, 이는 어떤 패턴을 내가 원하는 것으로 대체해준다.

 

그럼 replace와는 무엇이 다를까?

  • replace 함수는 어떤 문자를 다른 문자로 대체해주는 것
  • 그러나 re.sub는 어떤 패턴에 맞는 문자를 대체해준다.
1. 먼저 import re를 해야한다.
2. re.sub('패턴', '바꿀문자열', '문자열', 바꿀횟수) 또는  re.sub('패턴', 교체함수, '문자열', 바꿀횟수)
여기서 바꿀 횟수를 넣으면 지정된 횟수만큼 바꾸며 바꿀 횟수를 생략하면 찾은 문자열을 모두 바꿔준다.

 

 answer = re.sub("a|e|i|o|u", "", my_string) 

이 코드는 my_string에서 a 또는 e 또는 i 또는 o 또는 u가 나오면 없애라는 코드이다.

문자뿐 아니라 숫자도 가능하다.

 

>>> answer =  re.sub('[0-9]+', "!", "안녕하세요. 저는 9월 8일생입니다.")
>>> print(answer)
안녕하세요. 저는 !월 !일생입니다.

 

re.sub 함수는 바꿀 문자열 대신 교체함수를 지정할 수 있다.

def multiple2(m):
    n = int(m.group())
    return str(n*2) # 숫자에 2배를 곱해주는 함수

import re
answer = re.sub('[0-9]+', multiple2, '10에 2를 곱하면 20이지')
# [0-9] : 0부터 9까지의 숫자
print(answer) #20에 4를 곱하면 40이지

이렇게 함수를 지정해줄 수도 있다.

 

lambda를 이용할 수도 있다.

import re
answer = re.sub('[0-9]+', lambda x: str(int(x.group())*2), '10에 2를 곱하면 20이지')
# [0-9]+ : 0부터 9까지의 숫자
print(answer) #20에 4를 곱하면 40이지

 

 

3. 숨어있는 숫자의 덧셈

문자열 my_string이 매개변수로 주어집니다. my_string안의 모든 자연수들의 합을 return하도록 solution 함수를 완성해주세요.

 

# 숨어있는 숫자의 덧셈
def solution(my_string):
    number = ['1','2','3','4','5','6','7','8','9']
    answer = 0
    for i in my_string:
        if i in number:
            answer += int(i)
    print(answer)

# 다른 사람 풀이
def solution(my_string):
    return sum(int(i) for i in my_string if i.isdigit())

def solution(my_string):
    answer = 0
    for i in my_string:
        try:
            answer = answer + int(i)
        except:
            pass # 문자인 경우는 오류라서 except
    return answer