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)를 복습해볼 수 있었던 좋은 문제였다 :)
'Algorithm 💡 > String' 카테고리의 다른 글
[소프티어 7703번] X marks the Spot (한양대 HCPC 2023) (1) | 2024.06.16 |
---|---|
[백준 5052번] 전화번호 목록 (0) | 2023.12.13 |
[프로그래머스] 옹알이(2) (0) | 2023.07.22 |
[프로그래머스] 문자열 나누기 (0) | 2023.07.21 |
[프로그래머스] 문자열 밀기 (0) | 2023.07.21 |