문자열을 분리하고 변형해야 하는 코딩 테스트 문제에서 공백 문자가 연속으로 나오는 경우가 많이 있습니다. 공백을 기준으로 문자열을 분리할 때 자연스럽게 split() 함수를 사용하게 되는데, 이 경우 연속 공백을 상실하게 되는 문제점이 발생합니다.
연속 공백을 유지하면서 문자열을 분리하여 리스트로 만들기 위해 정규식(regular expression)을 사용할 수 있습니다.
https://school.programmers.co.kr/learn/courses/30/lessons/12951#
프로그래머스 JadenCase 문자열 만들기 문제를 가지고 방법을 설명해 보겠습니다. (다른 다양한 문제에서도 활용할 수 있습니다!)
문제 : JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. 문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.
이렇게 공백문자가 연속해서 나올 수 있다는 조건이 있는 경우 split() 함수를 사용하면 공백 여러개가 모두 없어져버리므로 조심해야 합니다.
저는 먼저 단어 1개를 JadenCase로 바꾸어 리턴하는 함수 jaden을 작성했습니다.
def jaden(w):
try:
# 첫 번째 글자가 정수일 때
int(w[0])
return w[0] + w[1:].lower()
except:
# 첫 번째 글자가 정수가 아닐 때
return w[0].upper() + w[1:].lower()
이렇게 작성한 jaden 함수를 가지고 최종 solution 함수를 작성해 볼게요.
import re
먼저 정규식 패키지를 불러옵니다.
word = "Hello World Bye"
위의 예시를 단어와 공백문자로 구분한 리스트를 어떻게 만들 수 있을까요?
word = "Hello World Bye"
re.findall("\S+|\s+",word)
# ['Hello', ' ', 'World', ' ', 'Bye']
- re.findall() : RE가 일치하는 모든 부분 문자열을 찾아 리스트로 반환합니다. 활용해서 원하는 구성요소를 찾아 리스트로 만들어줍니다.
- \s+ : 일치하는 모든 공백 문자를 찾아줍니다. (여러 개의 공백도 하나로 평탄화하지 않고 유지한 채로 찾아줍니다.)
- \S+ : 일치하는 모든 비공백 문자를 찾아줍니다.
결과를 보면 여러 개의 공백 문자가 잘 보존되어 있는 것을 볼 수 있습니다. 이제 최종 솔루션 함수를 작성해 볼게요.
def jaden(w):
try:
# 첫 번째 글자가 정수일 때
int(w[0])
return w[0] + w[1:].lower()
except:
# 첫 번째 글자가 정수가 아닐 때
return w[0].upper() + w[1:].lower()
import re
def solution(s):
# 입력 받은 s를 whitespace와 nonwhitespace로 구분합니다
words = re.findall("\S+|\s+", s)
answer = ""
for word in words:
# 만약 공백문자가 아니라면 jaden 함수를 적용해서 answer에 추가합니다.
if word.isalnum():
answer += jaden(word)
# 만약 공백문자라면 그냥 바로 answer에 추가합니다.
else:
answer += word
return answer
'Code > function snippet' 카테고리의 다른 글
파이썬 객체와 메모리 | 참조복사, 얕은복사, 깊은복사 (copy 라이브러리) (5) | 2024.11.06 |
---|---|
python | numpy 라이브러리를 이용하여 최대공약수, 최소공배수 구하기 (gcd, lcm) (0) | 2024.04.08 |
python | 재귀함수 (팩토리얼 예제) (0) | 2024.04.01 |
python | 소수 판별 함수 작성하기 (prime number) (0) | 2024.04.01 |
python | 약수(factor) 리스트업 함수 작성하기 + 메모화 (memorization) (0) | 2024.04.01 |