[프로그래머스] Lv.2 JadenCase 문자열 만들기 (python)

채채·2023년 12월 10일
0
post-thumbnail

✅ 문제 링크

JadenCase 문자열 만들기


✅ 문제 설명

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.

✅ 제한사항

  • s는 길이 1 이상 200 이하인 문자열입니다.
  • s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
    • 숫자는 단어의 첫 문자로만 나옵니다.
    • 숫자로만 이루어진 단어는 없습니다.
    • 공백문자가 연속해서 나올 수 있습니다.

✅ 입출력 예

sretrurn
"3people unFollowed me""3people Unfollowed Me"
"for the last week""For The Last Week"

✅ 나의 풀이

첫 문자가 알파벳인지 검사해서 맞다면 대문자+소문자형식으로, 아니라면 모두 소문자 형식으로 추가하려고 했다. 그러나 런타임에러가 뜨고 마는데...
찾아보니 조건 하나를 무시했던 거였다 🤔

  1. 공백 문자가 여러 개 등장할 수 있다. 공백 그 자체가 문자열에 포함된 것이기 때문에 꼭!!! split(' ') 형식으로 나눠줘야 한다. 그냥 split() 만 쓰면 안됨
  2. 공백도 포함해서 list가 생성되기 때문에, 원소가 공백인지 검사해주는 조건이 필요했음
  3. 그리고 숫자는 upper()를 해도 숫자이므로 그냥 함수 적용해도 된다.

✅ CODE

def solution(s):
    answer = ''
    s = s.split(' ')

    for i in range(len(s)):
        if s[i]:
            s[i] = s[i][0].upper() + s[i][1:].lower()
        else:
            answer += ' '
            
    return ' '.join(s)

정답코드는 이거라고 한다.

def solution(s):
    answer = ''
    s = s.split(' ')
    
    for i in range(len(s)):
        s[i]=s[i].capitalize()
        
    answer=' '.join(s)
    return answer

capitalize()의 경우 공백도 알아서 걸러주나보다.
첫 글자 대문자 + 나머지 소문자를 알아서 해주는 편리한 함수

✅ 시간복잡도

테스트 1 〉	통과 (0.01ms, 10.2MB)
테스트 2 〉	통과 (0.01ms, 10.3MB)
테스트 3 〉	통과 (0.01ms, 10.2MB)
테스트 4 〉	통과 (0.01ms, 10.4MB)
테스트 5 〉	통과 (0.02ms, 10.3MB)
테스트 6 〉	통과 (0.01ms, 10.3MB)
테스트 7 〉	통과 (0.02ms, 10.3MB)
테스트 8 〉	통과 (0.01ms, 10.4MB)
테스트 9 〉	통과 (0.01ms, 10.3MB)
테스트 10 〉	통과 (0.01ms, 10.4MB)
테스트 11 〉	통과 (0.01ms, 10.4MB)
테스트 12 〉	통과 (0.01ms, 10.2MB)
테스트 13 〉	통과 (0.01ms, 10.3MB)
테스트 14 〉	통과 (0.01ms, 10.2MB)
테스트 15 〉	통과 (0.01ms, 10.2MB)
테스트 16 〉	통과 (0.01ms, 10.3MB)
테스트 17 〉	통과 (0.01ms, 10.3MB)
테스트 18 〉	통과 (0.01ms, 10.4MB)
  • list slicing의 경우 시간 복잡도는 list[a:b] 인 경우 O(b-a)
  • 슬라이스하고자 하는 범위 길이에 비례한다.
  • capitalize()의 시간 복잡도는 O(N)이라고 한다.
  • 결국 list slicing이나 capitalize 함수나 원소를 하나씩 순회하는건 마찬가지라 성능 면에서 큰 차이는 없을 듯 하다. 그러나 슬라이싱은 반복문 안에서는 최대한 자제하는 습관을 들이는게 좋겠다..

✅ 배운 함수

대문자인지 소문자인지 판별

  • isupper() upper() islower() lower()

문자열인지 숫자인지 판별

  • isdecimal() : 어떤 문자열이 int 형으로 변환 가능한가 (0~9)
  • isdigit() : 어떤 문자열이 숫자의 형태인가 (3²)
  • isnumeric() : 숫자값 표현에 해당하는 문자열인가 (½)
  • isalpha() : 주어진 문자열이 알파벳으로만 구성되었는가 (중간에 공백이 있으면 False)
  • isalnum() : 주어진 문자열이 알파벳+숫자로만 구성되었는가 (중간에 공백이 있으면 False)

첫 글자를 대문자로 변환

  • capitalize() : 첫 글자만 대문자, 나머지는 소문자
  • title() : 첫 글자가 아니라도 띄어쓰기/숫자/특수기호/알파벳 이외 문자들을 기준으로 나뉜 모든 첫글자를 대문자로 바꿔줌
profile
성장하는 사람

0개의 댓글