<로직 고민/>
- 음 일단 단어를 구분해야 하므로 공백을 기준으로 split 해서 배열에 넣는다
- 배열을 for문에 돌리면서 문자열의 0번째 인덱스가 숫자면 0번째 인덱스 외의 문자를 다 소문자로 만든 후 answer에 더해준다
- 숫자가 아니면 0번째 인덱스는 대문자, 그 외 문자는 소문자로 바꾼다(슬라이싱으로 되지 않을까?!)
- 배열의 맨 끝 원소인 경우 공백을 더하지 않고, 아닌 경우 공백을 더한다
def solution(s):
answer = ''
s_array = s.split()
for s_ in s_array:
try:
int(s_[0])
answer += s_[0] + s_[1:].lower()
except:
answer += s_[0].upper() + s_[1:].lower()
if s_ != s_array[-1]:
answer += " "
return answer
- 이렇게 풀었는데 예시 문제는 통과되고, 채점 돌리니까 18 케이스 중에 10 케이스가 실패다 ㅋㅋ큐ㅠㅠ
- 공백문자가 연속해서 나올 수 있습니다 라는 제한사항을 고려하지 않아서 그런 거 같은데 이게 무슨 말인지 모르겠다..!
- 아 알겠다
- 공백이 여러 개 나올 수 있는데 단어별로 쪼개주려면 공백 한 칸을 기준으로 일단 split 해야 함
- 그렇게 해서 나눠진 단어 or 공백인 원소들을 하나씩 돌려가면서 문자열이 숫자나 영어, 한글로 되어 있는지 확인하는 메서드인 isalnum()을 사용해서 True면 answer에 해당 원소의 0번째 인덱스는 upper하고 그 외 인덱스는 lower 해서 붙여준다
def solution(s):
answer = ""
s_array = s.split(" ")
for s_ in s_array:
if s_.isalnum():
answer += s_[0].upper() + s_[1:].lower()
else:
answer += s_
if s_ != s_array[-1]:
answer += " "
return answer
- 처음에는 이렇게 answer가 문자열로 선언되어 있어서 그걸로 맞추려고 끝 원소 아니면 공백을 더해주는 식을 추가했었는데, 생각해보니까 리스트로 선언해서 마지막에 공백 한 칸으로 join 하면 된다는 게 생각나서 그렇게 수정했다!
- 위 코드도 정답이긴 하다
<완성된 풀이/>
def solution(s):
answer = []
s_array = s.split(" ")
for s_ in s_array:
if s_.isalnum():
answer.append(s_[0].upper() + s_[1:].lower())
else:
answer.append(s_)
return " ".join(answer)
<다른 사람 풀이/>
- 천재풀이1
def solution(s):
return s.title()
- 와 미쳤다
- 이런 메서드가 있었다니!!
- 근데 조건이 바껴서 이제는 통과 안 된다고 한다
- 앞에 공백이 있는 경우를 처리하지 못한다는군
- 천재풀이2
def solution(s):
return ' '.join([word.capitalize() for word in s.split(" ")])
- 와우 내 풀이를 한 줄로 바꾼 것 같다
- 근데 이제 upper, lower 따로 할 거 없이 capitalize() 메서드로 한 방에..
- capitalize()는 맨 첫 글자만 대문자로 바꿔주는 메서드라고 한다
- capitalize()는 문자열의 0번째 인덱스만 대문자로 바꾸고, title()은 문자열 내의 각 단어(공백이나 특수문자로 분리된)의 첫 글자를 대문자로 바꾼다
- 천재풀이3
def solution(s):
answer = []
words = s.split(" ")
for word in words:
if s_:
answer.append(word[0].upper() + word[1:].lower())
else:
answer.append(word)
return " ".join(answer)
- 내 풀이에서 isalnum()은 필요없는 거였다,,,
- 그냥 공백이 아니면 True가 나오고 공백이면 False가 나오나보군...