https://programmers.co.kr/learn/courses/30/lessons/12951?language=python3
최종 코드
def solution(s):
i = 0
while i < len(s):
if i==len(s)-1: return s
if s[i] == " ":
i += 1
s = s[:i] + s[i].upper() + s[i+1:].lower()
else:
if i == 0: s = s[i].upper() + s[i+1:].lower()
i += 1
return s
풀이 과정
풀이 시간 37분
1. 체크 사항
문제에서 주어지지 않는 중요한 체크 사항이 있다. "연속된 공백이 가능하다."는 점이다.
처음 문제를 풀었을 때에는 이 점을 고려하지 않고, 파이썬 내장 함수인 upper()과 lower()을 사용하여 간단하게 풀었다.
코드 실행 결과, 샘플 테스트 케이스 2개는 모두 성공했지만 채점 결과 실패였다.
따라서, " for the 3last weeK "인 경우, " For The 3last Week "을 출력하는 예시로 풀이 과정을 이야기 해보려 한다.
* 맨 앞 공백과 the와 last 사이의 연속된 공백, 맨 뒤의 공백 모두 출력이 돼야 OK
2. while 문
나는 이 문제를 단어의 첫 문자는 대문자로, 나머지 모든 문자열은 소문자로 만들어 주면서 0번째 문자열 부터 마지막 문자열까지 순서대로 탐색하여 문자열을 업데이트 해주는 방식으로 풀었다.
1. s[i]가 공백인 경우
if s[i] == " ":
i += 1
s = s[:i] + s[i].upper() + s[i+1:].lower()
i += 1을 해주어 i는 다음 문자열 인덱스가 된다.
s 를 다음 인덱스 전 까지의 s[:i] + 다음 인덱스의 문자열의 대문자 s[i].upper() + 나머지 문자열을 모두 소문자로 바꾼 s[i+1:].lower()로 바꾸어 준다.
2. s[i]가 공백이 아닌 경우
else:
if i == 0: s = s[i].upper() + s[i+1:].lower()
i += 1
i += 1을 해준다.
이 때, 예외처리를 해주어야 하는데 문자열의 첫 문자일 경우이다. 이 경우 첫 문자를 대문자로 바꿔주어야 한다.
위의 과정을 문자열 s 길이만큼 반복하도록 하면 문제를 해결 할 수 있다.
다른 사람의 풀이 분석
def solution(s):
return ' '.join([word.capitalize() for word in s.split(" ")])
1. 문자열 s를 공백에 따라 나누어 리스트 생성
s = " for the 3last weeK "
print([word for word in s.split(" ")])
>> ['', 'for', 'the', '', '3last', 'weeK', '']
2. 리스트 안의 문자열 capitalize
s = " for the 3last weeK "
print([word.capitalize() for word in s.split(" ")])
>> ['', 'For', 'The', '', '3last', 'Week', '']
capitalize()에 대해 공부하려면 아래 참고 부분의 포스트를 참고하면 된다.
3. 리스트 -> 문자열 변환
이때 '(공백)'.join을 해주어 리스트 요소 사이에 공백이 들어가도록 한다.
참고
- 파이썬 내장 함수 capitalize 2021/01/09 - [Python/내장 함수] - upper, lower, capitalize, title
'코테 노트 > 프로그래머스' 카테고리의 다른 글
Level 2 소수만들기 Python 3 (0) | 2021.01.21 |
---|---|
Level 2 올바른 괄호 Python (0) | 2021.01.15 |
Level 2 짝지어 제거하기 (0) | 2021.01.14 |
Level 2 N개의 최소공배수 Python3 (0) | 2021.01.14 |
Level 2 행렬의 곱셈 Python3 (0) | 2021.01.08 |