본문 바로가기
코테 스터디 99클럽

99클럽 코테 스터디 4일차 TIL + 문자열

by leelisa 2024. 7. 26.

오늘의 문제 - 문자열

문제 설명

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)

 

풀이 방식

  1. split 함수를 이용해 공백을 기준으로 문자열을 자른다.
    ex) "  for the last  week" => ['', '', 'for', 'the', 'last', '', 'week']
  2. 공백 기준으올 split 후의 리스트를 순회하며 ''가 아닌 item만 capitalize를 이용하여 앞글자를 대문자로 나머지를 소문자로 수정하여 answer에 더한다. (첫 번째 시도에서는 upper, lower 사용)
  3. 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
  1. 문자열을 문자 리스트화한다.
  2. 이전 문자(preFlag)와 현재 문자(cur)를 기준으로 현재 문자를 대문자 소문자 변환을 결정한다.
    첫번째 원소의 경우, preFlag만 저장하고 preFlag가 알파벳인 경우에만 대문자 변환
    두 번째 원소부터, 현재 문자가 알파벳일 때, 앞 문자가 공백인 경우만 대문자로 변환하고, 이외의 경우에는 소문자로 변환한다.
  3. 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(리스트)

 

++범위 보고 시간복잡도 확인해서 풀이하기