[알고리즘] 프로그래머스 | JadenCase 문자열 만들기
JadenCase 문자열 만들기
답:
def solution(s):
new_list = []
s_list = s.split(" ")
for st in s_list:
if st == " ":
new_list.append(" ")
else:
new_list.append(st[:1].upper() + st[1:].lower()) #st[0]으로 하면 오류가 남..
new_s = " ".join(new_list)
return new_s
리팩토링 - st[0]-> st[:1]로 바꾸면서 if문이 필요없어졌음
def solution(s):
new_list = []
s_list = s.split(" ")
for st in s_list:
new_list.append(st[:1].upper() + st[1:].lower())
return " ".join(new_list)
capitalize()함수도 잘 작동
def solution(s):
new_list = []
s_list = s.split(" ")
for st in s_list:
new_list.append(st.capitalize())
return " ".join(new_list)
split없이 풀이하기
def solution(s):
answer = ""
answer += s[0].upper()
for i in range(1, len(s)):
if s[i-1] == " " and s[i].isalpha():
answer += s[i].upper()
else:
answer += s[i].lower()
return answer
while로 풀이하기
def solution(s):
answer = ""
answer += s[0].upper()
i = 1
while len(s) > i:
if s[i-1] == " " and s[i].isalpha():
answer += s[i].upper()
else:
answer += s[i].lower()
i += 1
return answer
문제 분석 및 해석
문자열 s가 주어짐
각 글자의 첫 글자가 "문자면"
대문자, 나머지글자는 소문자.
해서 다시 문자열로 return
>> 풀이생각
""함수""
방법1.
split()
lower() upper()
join()
방법2.
split()
capitalize()
방법3.
title()
방법1 lower() upper()
테스트케이스 통과
def solution(s):
new_list = []
s_list = s.split()
for st in s_list:
new_list.append(st[0].upper() + st[1:].lower())
return " ".join(new_list)
방법2 capitalize()
테스트케이스 통과! 맨 앞글자가 문자가 아니면 뒤 글자들만 lowercase로 변경해주었다
def solution(s):
new_list = []
s_list = s.split()
for st in s_list:
st = st.capitalize()
new_list.append(st)
return " ".join(new_list)
방법3 title()
title()의 경우 어떤 경우에도 알파벳문자들의 맨 앞글자를 대문자로 바꾸어 준다.
def solution(s):
new_list = []
s_list = s.split()
for st in s_list:
new_list.append(st.title())
return " ".join(new_list)
따라서 숫자와 붙어있는 문자가 대문자로 변하여 테스트케이스부터 실패케이스가 뜬다.
실행한 결괏값 "3People Unfollowed Me"이 기댓값 "3people Unfollowed Me"과 다릅니다.
시도해본 것은 좋았으나 위 방법들에는 치명적인 실수가 있었다.
문제의 제한 조건
- s는 길이 1 이상 200 이하인 문자열입니다.
- s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
- 숫자는 단어의 첫 문자로만 나옵니다.
- 숫자로만 이루어진 단어는 없습니다.
- 공백문자가 연속해서 나올 수 있습니다.
이 부분을 고려하지 않아 공백이 하나인 테스트케이스는 정상적으로 성공하지만 공백이 여러개인 케이스는 실패하는 문제가 발생했다.
입력 | 출력 |
"for the last week" | "For The Last Week" |
이런 식으로 공백이 여럿 있으면 인자 값을 주지 않은 split()은 모든 공백을 지워버린다.
split(" ")으로 공백 문자열을 인자값으로 주면 1개 이상의 공백 문자열은 list에 담아주는 것을 확인할 수 있다.
split없이도 풀어보자!
>>> 풀이생각
첫글자 [0] 가 isalpha면 upper()
글자가 isalpha()고 앞이 공백이면 upper(),
조건을 충족하지 못하면 lower()
풀이
첫글자 [0] 가 isalpha면 upper()에서 1번째를 더하고 시작하도록 하였는데
숫자 케이스를 포함하지 않아 숫자케이스가 오류가 났음
그래서 if 문에 or를 추가했는데
결국 문자든 숫자든 upper()를 먹이는건 같아서 if문의 의미가 사라짐
answer = ""
if s[0].isalpha() or s[0].isdigit():
answer += s[0].upper()
따라서 if문은 제거하고 그냥 upper()하여 더해주도록 하였다.
answer = ""
answer += s[0].upper()
리뷰.
백준에서 늘 빈 인자값으로 split함수를 사용해와서 공백을 다 지워버리는 것을 어떻게 해결할지에 대해 고민하는데에 시간이 걸렸다.
split()에는 앞으로 무조건 인자 값을 넘길것이다...
문제를 풀이할때는 제한사항을 꼼꼼히 확인하고,
함수에 대한 활용을 할때 어떤 것이 올바른 방법인지 잘 짚어보고 사용하도록 하여 휴먼에러가 나지 않게 주의하자.
+++++ st[0] 과 st[:1]의 차이로 오류가 났던 문제 +++++
아쉽게도 결과값으로 정답이 나오진 않았지만 st[0]의 오류 원인을 찾게 되었다.
def solution(s):
new_list = []
s_list = s.split(" ")
for st in s_list:
if st:
new_list.append(st[0].upper() + st[1:].lower())
return " ".join(new_list)
입력값 〉 | "for the" |
기댓값 〉 | "For The" |
실행 결과 〉 | 실행한 결괏값 "For The"이 기댓값 "For The"과 다릅니다. |
st[0]값을 넣으면 IndexError: string index out of range오류.
print(st[0])를 할 경우에도 오류가 남
이렇게 되면 st[0] 자체를 불러오는 것에대한 문제임!
st[0]가 빈 문자열 “ “ 일 때 오류가 나는 것이었다
공백이 들어가있어 문자열이 채워져있다고 생각하고 있었는데 이것도 마찬가지로 빈 문자열이라는 것을 알게되었음!
Thanks to 새벽반👍