프로그래머스

프로그래머스 - JadenCase 문자열 만들기 [Python]

SS_G 2023. 7. 26. 01:35
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/12951?language=python3# 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

안녕하세요~ JadenCase 문자열 만들기 문제를 포스팅 하겠습니다.

 

문제 이해

이 문제는 주어진 문자열을 JadenCase로 변환하는 것을 요구하고 있습니다. JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열을 말합니다. 여기서 주의할 점은 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 써야한다는 점입니다.

예를 들어, 문자열이 "3people unFollowed me"라면 "3people Unfollowed Me"을, "for the last week"라면 "For The Last Week"을 반환해야 합니다.

 

문제 접근 방식

문제를 해결하기 위해서는 각 단어의 첫 문자를 대문자로, 나머지 문자를 소문자로 만드는 과정이 필요합니다. 이를 위해 str.upper()와 str.lower() 함수를 사용할 수 있습니다. 그러나 문자열을 단어로 분리할 때는 str.split(' ')를 사용하여 문자열을 분리해야 합니다. str.split() 함수를 사용하면 연속된 공백을 무시하고 문자열을 나누게 되므로, 원래 문자열의 공백 구조를 유지할 수 없습니다.

 

코드 작성

def solution(s):
    words = s.split(" ")

    p_word1 = []

    for word in words:
        p_word2 = []
        for i in range(len(word)):
            if i == 0:
                p_word2.append(word[i].upper())
            else:
                p_word2.append(word[i].lower())

        p_word1.append(''.join(p_word2))

    return " ".join(p_word1)

 

코드 해설

이 코드는 주어진 문자열을 split(' ') 함수를 사용하여 공백을 기준으로 단어로 분리합니다. 그런 다음 각 단어를 순회하면서 첫 문자를 대문자로, 나머지 문자를 소문자로 변환합니다. 변환된 단어는 processed_words라는 리스트에 추가됩니다. 모든 단어를 처리한 후, join 함수를 사용하여 변환된 단어를 다시 하나의 문자열로 합칩니다.

 

Split()의 이해 (틀린 코드)

Python의 문자열 메서드 중 "capitalize()" 라는 문자열의 첫 글자를 대문자로 만들어주는 메서드가 있습니다.

이걸 쓰면 쉽게 풀겠구나 생각을 해서 사용했더니 2개의 테스트케이스는 통과하는데 나머지 테스트 케이스를 통과하지 못했습니다.

 

def solution(s):
    words = s.split()
    words = [word.capitalize() for word in words]
    print(words)
    answer = ' '.join(words)
    return answer

 

왜 그럴까 예외 케이스를 생각해보았지만 찾지 못하였습니다.

그런데 우연히 split(' ')을 붙어보니 통과가 되는걸 확인할 수 있었습니다!

저는 지금까지 split() 와 split(' ')가 공백을 제거해주는 것으로 똑같게 알고 있었습니다.

 

다음 코드를 통해 'split()' 와 'split(' ')' 의 차이점을 알아봅시다!

s1 = 'hello  world'
s2 = '  hello world  '

# split()
print(s1.split())  # ['hello', 'world']
print(s2.split())  # ['hello', 'world']

# split(' ')
print(s1.split(' '))  # ['hello', '', 'world']
print(s2.split(' '))  # ['', '', 'hello', 'world', '', '']


# 결과
['hello', 'world']
['hello', 'world']
['hello', '', 'world']
['', '', 'hello', 'world', '', '']

결국 

- split()을 사용하면 연속된 공백은 하나의 공백으로 취급되어, 'hello'와 'world'만 반환합니다. 이는 split() 함수가 인자 없이 호출될 때 모든 공백 문자(스페이스, 탭, 개행 등)를 구분자로 취급하고, 연속된 공백을 하나의 구분자로 간주하기 때문입니다.

- 반면에 split(' ')를 사용하면, 연속된 스페이스는 각각 별도의 구분자로 취급되어, 'hello'와 'world' 사이에 빈 문자열을 추가로 반환합니다. 또한, 문자열의 시작과 끝에 있는 공백도 각각 별도의 구분자로 취급되므로, 시작과 끝에도 빈 문자열을 반환합니다.

 

마치며

이 문제는 문자열 처리 기능을 사용하여 문자열을 원하는 형태로 변환하는 방법을 연습하는 데 도움이 되었습니다.

 Python의 split, join, upper, lower 등의 문자열 처리 함수를 사용하면 이런 종류의 문제를 해결할 수 있습니다.

이 문제를 통해 이러한 기능들을 어떻게 조합하여 사용하는지를 배울 수 있었고, split() 와 split(' ')의 차이를 구분 할 수 있는 문제였습니다. 잘 확인해야 할 것 같네요..

반응형