본문 바로가기
알고리즘 풀이

[algorithm] 페어 - 프로그래머스:문자열 정렬하기 (팀원 풀이 해석)

by 째깍단 2023. 4. 12.

답:   Not mine

더보기
import re

def solution(my_string):
    answer = []
    num_my_string = re.findall("\d", my_string)
    num_my_string.sort()
    for number in num_my_string:
        answer.append(int(number))
    return answer#이 안에 작성

 

 

 

문제 분석 및 해석

 

"""

문자, 숫자가 혼합된 문자열 my_string

 

해야하는 작업

- 숫자 골라내기.  -> 이것 어떻게하나요

- 각각 리스트에 넣기

- 리스트 반환

 

문제에는 이렇게 써있지만

각각 리스트에 넣고 숫자를 골라내는게 좋을 것 같다

"""

더보기

...작성해보았지만 역시나 첫글자 h부터 오류가 난다.

 

my_string = "hi12392"

def solution(my_string):
    my_list = list(my_string)
    list_ = []
    for my in my_list:
        if int(my):
            list_.append()
        else:
            None
    return list_

print(solution(my_string))

 

 

이건 불가항력이지. 기능공부를 하자. 

 

 

 

30분 고민한 후 몰라서 못 푸는 문제라면 시간낭비하지 않기로 했으니, 힌트를 보았다.

 

그리고 해당 기능을 자세히 배우고 써보는 시간을 가졌다.

 

 

 

 

 

문자열에서 문자와 정수 분리하기

정규표현식에 대한 이해가 필요한 문제.

 

 

python에서는  in / .find() / .index() 등을 활용해 문자열에서도 특정 문자나 위치를 찾을 수 있다.

 

하지만 문자열 안의 정수만 추출하고자 한다면

위의 함수만으로는 한계가 있어 정규표현식을 사용하는 것.

 

import re

re.findall('\d+’)

 

 

 

re 모듈에 대해 알아보자!

 

regex  문자열 패턴을 표현하는 일종의 형식 언어.

RegEx, RegExp라 쓴다.

 

 

파이썬의 특수 기능 문자들을 메타 문자라고 한다

메타문자 : $()*+.?[]\^{}|

 

** 메타문자와 같은 모양의 문자를 매칭하고자 할때는 백슬래쉬를 앞에 붙여 \(, \* 등으로 표현해야한다 **

 

 

 

 

re 모듈의 함수 알아두기

 

  • match() : 문자열의 패턴이 일치하는지 확인하는데, 확인하고자 하는 패턴을 처음부터 순서대로 매칭한다.
                     1 - 12 는 매칭O, 1 - 21 은 매칭X 결과값을 가짐

 

  • search() : match와 유사하지만 처음부터 일치하지 않아도 되고, 패턴의 일치만을 고려해 결과를 반환함
                     1 - 12 는 매칭O, 1 - 21 은 매칭O 결과값을 가진다

 

  • findall() : 문자열 안에 패턴에 맞는 케이스를 찾아 리스트로 반환함

                   겹치는 것은 반환하지 않고, \d는 정수를 각각, \d+는 붙어있는 정수는 묶인 채로 반환한다.
                    => \d  digit(= 숫자)을 의미하는 것으로, 정규 표현식의 문자 클래스(character class) 중 하나

 

  • finditer() : findall과 유사하지만 iterator형식으로 반환

 

  • fullmatch() : 문자열의 시작과 끝이 정확하게 패턴과 일치할때만 반환
                          a - a 만 반환. a - aaa, a - aba 는 반환x

 

  • split() : 구분자를 기준으로 리스트로 쪼개어 줌, 쪼갤 개수 지정도 가능

 

  • sub() : 문자열에 맞는 패턴을 교체할 문자열로 교체함, 최대 교체 수 지정도 가능.
re.sub(‘a’, ‘b’, ‘abb’) #aaa반환

 

  • subn() : sub와 동일하지만 튜플형태로 (변환한 문자열, 매칭횟수) 반환됨

 

  • compile() : 패턴, 플래그가 동일한 정규식을 여러번 사용할때 지정하여 사용할 수 있도록 함.
c = re.compile(‘a’)
c.sub(‘b’, ‘abb’)  # aaa반환

 

 

  • purge() : compile 객체가 저장된 캐시를 초기화함
                    (100개이상이면 자동초기화지만 함수사용으로 바로 초기화할 수 있다)

 

 

  • escape() : 패턴을 입력받으면 특수 문자에 백슬래쉬(이스케이프) 처리를 하고 반환
re.escape(’(a)’) # \(a\)

 

 

- search()로 패턴에 맞는 문자열을 찾았을 경우 활용 가능

  • group() : 패턴에 맞는 문자열 추출 aaa
  • start() : 문자열의 어디에서 부터 패턴문자가 시작되었는지 출력 1
  • end() :  패턴문자가 어디까지 출력되었는지 3
  • span() : 어디부터 어디까지 출력되었는지 확인 (1, 3)

 

 

 

이 아래는 아직 어렵당..

 

[참조] : https://brownbears.tistory.com/506

 

 

 

 

 

 

이제 예제를 한 줄 씩 분석해보자.

 

import re

def solution(my_string):
    answer = []
    num_my_string = re.findall("\d", my_string).num_my_string.sort()
    # re모듈의 findall 함수를 사용
    # 두번째 인수로들어간 my_string을 \d로 digit(숫자)를 분리해준다. 
    # 이후 sort()로 오름차순 정리를 해준 후 변수에 저장

    # 한줄분해 =
    # num_my_string = re.findall("\d", my_string)
    # num_my-string = num_my_string.sort()

    for number in num_my_string:
        answer.append(int(number))
    # 출력 결과물이 정수가 담긴 list로 출력이므로 int를 넣어 append해준다.

    return answer

 

 

 


느낀점: 

 

매우 유익한 공부를 했다!

 

아직 모르는게 태산같지만 조금씩 조금씩 알아가자 

 

나는 언젠간 파이썬마스터가 될거야!