https://school.programmers.co.kr/learn/courses/30/lessons/12951
생각보다 쉽다고 만만하게 봤지만 런타임 에러 잔뜩 마주한 문제였다.
첫번째 시도
def solution(s):
answer = []
check = s.split(' ')
for text in check:
if text[0].isdigit():
text.lower()
answer.append(text)
else:
answer.append(text[0].upper() + text[1:].lower())
return ' '.join(answer)
단순하게 생각해서 공백으로 문자열을 구분해 준 뒤 구분한 문자열의 첫 글자가 숫자인지 확인해서 숫자라면 모두 소문자로 변경하고, 알파벳이라면 첫 글자는 대문자로 그 뒤는 모두 소문자로 변환하도록 했다.
문자열이 숫자로 이루어져 있는지 알파벳으로 이루어져 있는지 확인하기
근데 웬 걸,,, 런타임 에러가 우수수 우수수우수수,,,
두번째 시도
굳이 split 시킨 문자열의 첫 글자가 숫자인지 아닌지 판단할 필요가 없다는 걸 알게 되었다. if문을 사용하지 않아도 인덱스 슬라이싱으로 첫번째 글자는 upper, 두번째 글자는 lower를 해 주니 결과가 동일했다. 하지만 런타임 에러는 그대로였다.
찾아보니 단어의 첫 글자를 대문자로 바꿔주는 함수가 있었다.
capitalize()와 title() 두가지가 있는데 두가지의 작동 방식이 조금 다르다.
capitalize()는 문장에서 첫 단어의 첫 글자만 대문자로 바꿔주는 반면, title()은 문장에서 모든 단어들의 첫 글자를 대문자로 바꿔준다.
title()이 모든 단어라고 보는 기준은 공백, 특수문자, 숫자이기 때문에 해당 문제에서는 tilte()을 쓰는 것이 적합하지 않다. (문제에선 공백만 기준으로 하기 때문, 알파벳 사이에 특수문자가 있는 경우 대문자로 변경되면 안됨.)
def solution(s):
check = s.split(' ')
for i in range(len(check)):
check[i] = check[i].capitalize()
return ' '.join(check)
이렇게 if로 분기를 나누지 않고 바로 split한 문자들의 첫 글자만 대문자로 변경 한 후 join을 해 주니 런타임 에러가 해결 되었다!
파이썬 사용이 몇년째인데... 아직도 모르는 함수가 있다니.. 알고리즘 문제를 더 열심히 풀어야 할 이유가 생겼다.