Stay Hungry Stay Foolish

프로그래머스 코딩테스트/Level 2

[Programmers] L2. JadenCase 문자열 만들기 (Python)

dev스카이 2024. 11. 8. 20:01

[문제 링크] 👇

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


풀이 방법

📌주의할 점 : 공백이 여러개 일 때

 

1️⃣ 주어진 문자열을 split(' ')로 나누어 각 단어와 공백을 유지한 채 리스트에 담는다.

 

2️⃣ 리스트의 각 단어를 확인하면서,

  • 단어가 비어 있지 않다면 첫 문자를 대문자로 변환하고, 나머지 문자는 소문자로 변환한다.
  • 첫 문자가 알파벳이 아닌 경우는 그대로 둔다.

3️⃣ 변환된 단어 리스트를 다시 공백을 기준으로 문자열로 합쳐 반환한다.

 

대문자로 변환하는 방법

s.upper()

 

소문자로 변환하는 방법

s.lower()

 

Solution

def solution(s):
    words = s.split(' ')  # 공백 포함해서 나누기
    jaden_case_words = []
    
    for word in words:
        # 단어의 첫 문자 대문자, 나머지는 소문자로
        if len(word) > 0:
            jaden_case_words.append(word[0].upper() + word[1:].lower())
        else:
            jaden_case_words.append(word)  # 공백만 있는 경우는 그대로 추가
    
    return ' '.join(jaden_case_words)

 

다른 풀이

def solution(s):
    return ' '.join([word.capitalize() for word in s.split(" ")])

👩‍💻 회고

간단한 문제인데,, 제대로 못 풀었다. 왜 틀렸는지 한참동안 생각했었는데, 공백을 고려하지 않고 풀었었다. 

def solution(s):
    answer = ''
    for i in s.split():  # 공백 기준으로 분리한 문자열
        #if i[0].isalpha():  # 단어의 첫 문자가 알파벳일 경우
        answer += i[0].replace(i[0], i[0].upper())  # 단어의 첫 문자는 대문자로 변환
        answer += i[1:].replace(i[1:], i[1:].lower()) + " "  # 첫 문자를 제외한 나머지 문자는 소문자로 변환
    return answer.rstrip()  # 맨 뒤 공백은 제거

 

반례 케이스

# 1. 연속된 공백이 포함된 경우
print(solution("3people   unFollowed me"))  # "3people   Unfollowed Me"
# 2. 문자열 시작과 끝에 공백이 있는 경우
print(solution("   hello world   "))  # "   Hello World   "
# 3. 공백만 있는 경우
print(solution("    "))  # "    "

 

title()

다른 사람의 풀이 보니 단순히 title() 함수를 쓴 풀이도 있었다. title() 함수는 처음 봤는데, 문자열의 각 단어의 첫 글자를 대문자로 변환하고, 나머지 글자는 모두 소문자로 만드는 메서드라고 한다. 그런데 그렇게 하면 문제가 너무 쉬워져서 공백 제약사항을 더 추가시켜서 title() 로는 못 풀게 다시 만든 것 같다. title() 로 못 푸는 이유는 다음과 같다.

 

title() 주의사항

title()은 단순히 첫 글자를 대문자로 만들기 때문에, 의도하지 않은 결과를 가져올 수 있다. 예를 들어, "python's best"는 "Python'S Best"로 출력된다.

 

capitalize()

capitalize() 함수도 이번에 처음봤다. 이 함수는 문자열의 첫 글자만 대문자로 변환하고, 나머지 모든 글자는 소문자로 변환한다. 첫 글자만 대문자로 변환하기 때문에 split() 으로 단어를 분리하고 후에 join 하는 연산이 추가로 필요하다.