제 개인적인 생각으로는 2번이 좋은 코드라고 생각하는데 다들 짧은 코드를 칭찬하시더라구요!
무슨 코드가 더 좋은 코드인지는 더 알아가야 할 것 같습니다.
1. 문제 설명
위의 링크에 접속하시면 문제가 나옵니다.
제가 중요하게 생각했던 부분은
1. 첫 글자만 대문자이고(숫자나 문자일 경우에는 그대로)
2. 나머지 글자는 모두 소문자이다(숫자, 문자는 위와 같습니다.)
3. 공백 값도 고려해야 한다.
입니다!
제일 어려웠던 부분은 3. 공백 값도 고려한다는 부분인데요,
만약 " banana" 가 input으로 들어왔다면, " Banana" 가 출력되어야 합니다.
공백을 버리면 안되고, 공백은 문자로 취급하지 않습니다.
2. split(), join(), upper(), lower() 함수와 코드 설명
2-1. split() 함수
#앞으로 설명을 위해 문자열을 str, 리스트를 lis라고 칭하겠습니다!
str.split(' ')
= 문자열 str을 ' '(공백)으로 구분하여, 리스트를 반환하겠다. 라는 뜻입니다.
str="a b c" 라면, str.split(' ')=["a", "b", "c"] 가 됩니다.
str.split()
이러한 형태의 함수 또한
str="a b c"라면, str.split()=["a", "b", "c"]가 됩니다.
하지만 둘의 차이점은 str.split(' ') 은 확실히 공백이 구분자인 것입니다.
만약 str="vvBanana" (여기서 v는 공백입니다. 스페이스요) 라면
str.split(' ')=["", "","banana"] 로 구분될 수 있습니다.
앞의 공백 또한 구분자로 여겨 ""v"" (빈 문자열-v-빈문자열) 의 형태로 인식합니다.
vvbanana는 "" v "" v banana -> ["", "", banana] 의 형태가 됩니다.
반면에,
str.split()=["banana"]의 형태가 됩니다.
2-2 join() 함수
join() 함수는 split()과 반대로, 리스트를 문자열로 바꿔주는 함수입니다.
input: 리스트 output: 문자열
기본적인 형태는
"구분자".join(lis)
로, lis(리스트)에 있는 값들 사이사이에 구분자를 넣은 문자열을 반환하여줍니다.
lis=['a', 'b', 'c']
" ".join(lis) 는 "a b c" 입니다.
2-3 upper() 함수
upper() 함수는 문자열을 모두 대믄자로 변환해주는 함수입니다.
str.upper()
구조로 사용하면됩니다.
2-4 lower() 함수
lower() 함수는 문자열을 모두 소문자로 변환해주는 함수입니다.
str.lower()
구조로 사용하면 됩니다.
저는 총 코드를 두 개 제출했습니다.
1번)
def solution(s):
words=s.split(' ') #공백을 기준으로 분할 (빈 문자열이 포함 됨)
answer=[w[0].upper()+w[1:].lower()+' ' if w!='' else ' ' for w in words]
return ''.join(answer)[:-1] #문자열로 반환하기 위함
여기서
answer=[w[0].upper()+w[1:].lower()+' ' if w!='' else ' ' for w in words]
의 구조를 설명해보겠습니다.
반환형이 리스트이기 때문에 리스트 안에 for과 if문을 넣었습니다.
공백을 기준으로 분할된 문자열의 리스트를 기준으로 for문 반복합니다.
각각 리스트의 요소인 w가 빈 문자열이 아니면 -> 공백이 아닌 것(문자열임)
해당 문자열의 첫번째 단어만 대문자로 바꾼 후,
슬라이싱 기법을 사용하여 w[1:], 즉 해당 문자열의 첫 번째 단어 이후부터 마지막 단어까지 소문자로 바꿔줍니다.
(여기서 문자열 사이에는 원래 공백이 있으므로 공백을 포함합니다. )
만약 w가 빈 문자열 이라면, 공백도 당연히 포함되어야 하기 때문에 공백을 넣어줍니다.
한 문장에 리스트, if-else, for문을 다 넣기 위한 형태는 위와 같이 됩니다.
2번)
def solution(s):
answer = ''
words=s.split(' ')
for i in words:
if i=='':
answer+=' '
else:
answer+=i[0].upper()+i[1:].lower()+' '
return answer[:-1]
사실 전 직관적인 것이 좋아서 이 코드가 더 좋다고 생각합니다.
2번 같은 경우에는 answer을 빈 문자열로 설정하여, for문을 통해 answer에 문자들을 점점 더해줍니다.
for문의 내용은 위와 같습니다. (리스트의 경우를 문자열로 바꿨다고 생각하면 됩니다.)
사실 python을 공부한 적이 없어서 문법 하나하나 찾아보는 게 시간이 많이 걸리는 것 같습니다.