Code Wars 20 : Uncollapse Digits

김기욱·2021년 9월 17일
0

코딩테스트

목록 보기
60/68
post-custom-banner

문제설명

You will be given a string of English digits "stuck" together, like this:
"zeronineoneoneeighttwoseventhreesixfourtwofive"
Your task is to split the string into separate digits:
"zero nine one one eight two seven three six four two five"

요약 : 뭉쳐진 digit문자열을 공백자를 넣어서 띄어쓰기를 시켜줘라

제한사항

None

입출력 예시

"three"              -->  "three"
"eightsix"           -->  "eight six"
"fivefourseven"      -->  "five four seven"
"ninethreesixthree"  -->  "nine three six three"
"fivethreefivesixthreenineonesevenoneeight"  -->  "five three five six three nine one seven one eight"

풀이

import re
def uncollapse(digits):
    return re.sub('zero|one|two|three|four|five|six|seven|eight|nine', lambda x : x.group() +' ', digits).strip()

숫자에 해당하는 digit 문자열을 정의하고, 정의된 문자열을 정규표현식으로 찾은 후 공백자(' ')을 더 해줍니다.
re.sublambda식을 활용하면 정해진 조건에 따라 문자열을 쏙쏙 찾아서 변환이 가능합니다. 여기서 주의할 점은 정규표현식으로 찾아낸 후 반환되는 객체는 정규표현식 객체이므로 group()을 통해 문자열 형태로 반환해줘야 합니다. group()을 사용하지않고 단순하게 str(x)처럼 강제 캐스팅을 하게되면 원하는 결과가 반환되지 않습니다.
마지막으로 무작정 공백자(' ')를 더했을 경우 마지막digit문자열도 공백이 들어가게 되므로 이를 strip()을 통해 잘라줍니다.

다른풀이

import re
def uncollapse(digits):
    return ' '.join(re.findall('zero|one|two|three|four|five|six|seven|eight|nine', digits))

정규표현식을 쓴 것은 같으나, 람다식과 group()같은 다소 복잡한 표현식 없이 re.findall' '.join()으로 해치워 버리는 방식입니다. 좀 더 이해가 쉽네요 😎

profile
어려운 것은 없다, 다만 아직 익숙치않을뿐이다.
post-custom-banner

0개의 댓글