오늘의 문제 - 문자열
문제 설명
JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.
제한 조건
- s는 길이 1 이상 200 이하인 문자열입니다.
- s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
- 숫자는 단어의 첫 문자로만 나옵니다.
- 숫자로만 이루어진 단어는 없습니다.
- 공백문자가 연속해서 나올 수 있습니다.
내 풀이 및 접근 방식
첫 시도 => 44.4 오답
def solution(s):
answer = ''
for index, item in enumerate(s.split(' ')):
item = item[0].upper() + item[1:].lower()
if index == 0:
answer += item
else:
answer += ' '+item
return answer
두 번째 시도 => 44.4 오답
def solution(s):
answer = ''
for item in s.split(' '):
if item == '':
continue
if answer == '':
answer += item.capitalize()
else:
answer += ' '+item.capitalize()
print(answer)
풀이 방식
- split 함수를 이용해 공백을 기준으로 문자열을 자른다.
ex) " for the last week" => ['', '', 'for', 'the', 'last', '', 'week'] - 공백 기준으올 split 후의 리스트를 순회하며 ''가 아닌 item만 capitalize를 이용하여 앞글자를 대문자로 나머지를 소문자로 수정하여 answer에 더한다. (첫 번째 시도에서는 upper, lower 사용)
- answer가 빈 문자열인 경우(처음 추가하는 경우) 앞에 공백을 추가하지 않고 item을 붙이며, 2번째로 추가하는 경우부터 공백을 더하여 item을 이어붙인다.
첫 번째 시도와 두 번째 시도 모두 틀린 이유는 연속되는 공백은 제거하지 않고 단어만 수정해야하는데, 모든 단어 사이의 공백을 한 칸으로 만들어버렸기 때문이다.
맞는 답안 " for the last week" => ['', '', 'for', 'the', 'last', '', 'week'] => " For The Last Week"
내 풀이 " for the last week" => ['', '', 'for', 'the', 'last', '', 'week'] => "For The Last Week"
페어프로그래밍
페어프로그래밍에서는 가이드 분을 통해 split을 사용하지 않은 새로운 풀이로 접근했다.
def solution(s):
answer = ''
preFlag = ''
s_array = [c for c in s]
for i in range(len(s_array)):
if i == 0:
preFlag = s_array[i]
if preFlag.isalpha():
s_array[i] = s_array[i].upper()
else:
cur = s_array[i]
if cur.isalpha():
if preFlag == ' ':
s_array[i] = s_array[i].upper()
else:
s_array[i] = s_array[i].lower()
preFlag = cur
answer = ''.join(s_array)
return answer
- 문자열을 문자 리스트화한다.
- 이전 문자(preFlag)와 현재 문자(cur)를 기준으로 현재 문자를 대문자 소문자 변환을 결정한다.
첫번째 원소의 경우, preFlag만 저장하고 preFlag가 알파벳인 경우에만 대문자 변환
두 번째 원소부터, 현재 문자가 알파벳일 때, 앞 문자가 공백인 경우만 대문자로 변환하고, 이외의 경우에는 소문자로 변환한다. - join을 이용하여 모든 문자 원소를 다시 하나의 문자열로 합친다.
다른 풀이
아래의 코드들의 경우 세션 때 발표하신 다른 분 코드로, 내 첫 번째와 두 번째 코드와의 차이점은 join을 이용하여 문자열을 이음으로써, 기존의 공백들을 유지하는 점이다.
def solution(s):
return ' '.join([word.capitalize() for word in s.split(" ")])
def solution(s):
s = s.split(" ")
for i in range(len(s)):
s[i] = s[i][0].upper() + s[i][1:].lower()
print(s[i])
return " ".join(s)
회고
join과 split에 대해 공부하자
split - 문자열 분리하기
- 스트링 타입의 값을 구분자로 분리하여 리스트 형태로 반환
- 구분자를 매개변수로 넘겨주지 않을 경우, 공백을 기준으로 문자열 구분
ex) " app WEB "
매개변수 없는 경우 => ['app', 'WEB']
" " 공백 하나를 매개변수로 주는 경우 => ['',. '', 'app', '', '', '', 'WEB', ''] -
문자열.split(구분자)
join - 문자열 합치기
- 리스트의 각 문자열 사이에 연결자를 붙이고 하나의 문자열로 반환한다.
-
연결자.join(리스트)
++범위 보고 시간복잡도 확인해서 풀이하기
'코테 스터디 99클럽' 카테고리의 다른 글
99클럽 코테 스터디 6일차 TIL + 해시 (0) | 2024.07.28 |
---|---|
99클럽 코테 스터디 5일차 TIL + 해시 (0) | 2024.07.27 |
99클럽 코테 스터디 3일차 TIL + 문자열 (0) | 2024.07.24 |
99클럽 코테 스터디 2일차 TIL + 배열 (1) | 2024.07.23 |
99클럽 코테 스터디 1일차 TIL + 배열 (3) | 2024.07.23 |