Algorithm/String

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

킹우현 2024. 1. 5. 15:04

def solution(s):
    words = s.split()
    blanks = []
    
    for i,value in enumerate(s):
        if value == ' ': # 공백문자인 경우
            if i == 0: # 첫번째 문자인 경우(index error 방지)
                blanks.append(' ')
            else:
                if s[i-1] == ' ': # 연속된 공백문자일 경우
                    blanks[-1] += ' '
                else:
                    blanks.append(' ')
    
    def convertWord(string): # JadenCase로 문자열 변환해주는 함수
        result = ''
        for i,value in enumerate(string):
            if i == 0:
                if ord('a') <= ord(value) <= ord('z'):
                    result += chr(ord(value)-32)
                else:
                    result += value
            else:
                if ord('A') <= ord(value) <= ord('Z'):
                    result += chr(ord(value)+32)
                else:
                    result += value
        return result
    
    def startWithBlank(wordList, blankList):
        result = []
        
        for i in range(len(wordList)):
            result.append(blankList[i])
            result.append(wordList[i])
        
        return result
    
    def endWithBlank(wordList, blankList):
        result = []
        
        for i in range(len(wordList)):
            result.append(wordList[i])
            result.append(blankList[i])
        
        return result
    
    def blankInTheMiddle(wordList, blankList):
        result = []
        for i in range(len(blankList)):
            result.append(wordList[i])
            result.append(blankList[i])
        return result + [wordList[-1]]
    
    def blankOnBothSide(wordList, blankList):
        result = []
        for i in range(len(wordList)):
            result.append(blankList[i])
            result.append(wordList[i])
        return result + [' ']
    
    words = [convertWord(x) for x in words]
    
    if len(words) == len(blanks): # (단어 개수 == 빈칸 개수)
        if s[0] == ' ': # ' ' A ' ' B
            return "".join(startWithBlank(words,blanks))
        else: # A ' ' B ' '
            return "".join(endWithBlank(words,blanks))
    elif len(words) == (len(blanks) + 1): # A ' ' B (단어 개수 == 빈칸 개수 + 1)
        return "".join(blankInTheMiddle(words,blanks))
    elif len(words) == (len(blanks) - 1): # ' ' A ' ' B ' ' (단어 개수 == 빈칸 개수 - 1)
        return "".join(blankOnBothSide(words,blanks))

 

해당 문제는 모든 단어의 첫 글자를 대문자로 변환하는 문제인데, 생각보다 문제 푸는 시간이 오래 걸렸었다.

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

 

첫번째 문자만을 대문자로 변환해주기 위해 converWord() 라는 함수를 직접 구현하였지만 다른 사람들의 풀이를 보던 중 Python에 capitalize() 라는 아주 유용한 내장함수가 존재한다는 사실을 알게 되었다. (현타가 많이 왔지만 그만큼 문자열에 취약했다는 의미이기도 하니 이제라도 알았으니 오히려 잘 되었다 .. !)

 

'공백문자가 연속해서 나올 수 있습니다' 라는 조건 때문에 모든 경우의 수를 다 따져가며 복잡하게 풀이했었는데, split(' ')로 나눠주고 ' '.join으로 이어붙여주면 앞 뒤로 공백이 존재하든, 공백이 연속으로 존재하든 상관없이 처리가 가능했다.

 

문자열 관련 함수(upper / capitalize / title)아스키코드 변환 함수(ord / chr)를 복습해볼 수 있었던 좋은 문제였다 :)