알고리즘 풀이

[알고리즘] 프로그래머스 | JadenCase 문자열 만들기

째깍단 2023. 8. 25. 08:32

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에 담아주는 것을 확인할 수 있다. 

 

 

 

1번케이스 속도

 

 


 

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()

 

1번풀이보다 속도는 좀 느린편

 

 

 

리뷰.

백준에서 늘 빈 인자값으로 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 새벽반👍