본문 바로가기
Algorithm/Programmers

[Programmers / Level2] JadenCase 문자열 만들기

by 개복취 2024. 1. 14.

https://school.programmers.co.kr/learn/courses/30/lessons/12951

 

프로그래머스

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

programmers.co.kr


 

 

<내코드 - 오답>

def solution(s):
    s_list, result  = list(s.split()), []
    for token in s_list:
        token_list = list(token)
        if token_list[0].islower():
            token_list[0] = token_list[0].upper()
        for i in range(1, len(token_list)):
            if token_list[i].isupper():
                token_list[i] = token_list[i].lower()
        result.append(''.join(token_list))
        
    return ' '.join(result)

 

그냥 하라는대로만 작성했는데 반타작도 못함 GPT선생님께서는 두가지 말씀을 건내주셨다.

제시된 코드는 대부분의 경우에 잘 작동할 것 같지만, 두 가지 잠재적인 문제가 있습니다:
  • 빈 문자열 처리: 입력 문자열 s에 연속된 공백이 있거나, 문자열의 시작이나 끝에 공백이 있는 경우, split() 메서드는 빈 문자열을 리스트에 포함시킬 수 있습니다. 이 경우, token_list[0]에 접근하려고 할 때 IndexError가 발생할 수 있습니다.
  • 모든 문자가 대문자 또는 소문자인 경우: 문자열의 모든 문자가 대문자 또는 소문자인 경우에도 코드가 올바르게 작동할 것 같지만, 이러한 상황에서 불필요한 검사를 수행하게 됩니다.

아뿔싸 연속된 공백등 공백에 대한 처리가 미숙했다. 무지성 list(split())으로 인해 IndexError가 날 수 있다는 점을 지적해주셨다.

나머지는 불필요한 검사를 제거하라고 조언까지 해주셨다.

그리고 .split() 자체가 리스트를 반환해주기 때문에 굳이 list(s.split())을 쓰지 않아도 된다는점 이다.

 

<정해풀이1>

def solution(s):
    s_list, result  = s.split(" "), []
    for token in s_list:
        if token:  # 빈 문자열이 아닌 경우에만 처리
            token_list = list(token)
            token_list[0] = token_list[0].upper()  # 첫 글자를 대문자로
            for i in range(1, len(token_list)):
                token_list[i] = token_list[i].lower()  # 나머지 글자를 소문자로
            result.append(''.join(token_list))
        else:
            result.append(token)  # 빈 문자열 추가
        
    return ' '.join(result)

해당 코드도 나쁘지 않지만 capitalize 메소드를 사용해 문제를 해결할 수 있다.

 

<정해풀이2>

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

 

array클래스 내부에 capitalize메소드를 사용하면 원하는대로 나온다는걸 알게되었다.