DEV Community

myrlagksruf
myrlagksruf

Posted on

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

문제 주소

JadenCase 문자열 만들기


문제에 대한 첫인상

이걸 풀 때 대략 정답률이 78%였다. 그래서 쉽게 접근해본 거 같다.

문제가 원하는 것은 간단하게 첫 문자가 대문자로 되도록 바꾸게 하는 것이다.


첫번째 풀이

그냥 단순하게 띄어쓰기를 먼저 구해보기로 했다.

def solution(s):
    l = []
    for i in range(len(s)):
        if i == 0:
            l.append(i)
        elif s[i] == " ":
            l.append(i)
    print(l)
Enter fullscreen mode Exit fullscreen mode

근데 문제를 잘 읽어보니 다음과 같은 조건이 있었다.

- s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
  - 숫자는 단어의 첫 문자로만 나옵니다.
  - 숫자로만 이루어진 단어는 없습니다.
  - 공백문자가 연속해서 나올 수 있습니다.
Enter fullscreen mode Exit fullscreen mode

공백문자가 연속해서 나오는 것을 감안한다면 다시 짜야될 것 같다.

그럼 아예 띄어쓰기를 검사하지 말고 앞에 띄어쓰기 혹은 0번째인 문자 그러면서 영소문자인 문자를 검사하는 것이 좋을 것 같다.

def solution(s):
    l = []
    for i in range(len(s)):
        if i != 0 and s[i - 1] != ' ':
            continue
        if s[i] >= 'a' and s[i] <= 'z':
            l.append(i)
    print(l)
Enter fullscreen mode Exit fullscreen mode

그럼 그 문자들을 대문자로 바꿔주면 끝!

def solution(s):
    l = []
    for i in range(len(s)):
        if i != 0 and s[i - 1] != ' ':
            continue
        if s[i] >= 'a' and s[i] <= 'z':
            l.append(i)
    temp = list(s)

    for i in l:
        temp[i] = temp[i].upper()
    return "".join(temp)

Enter fullscreen mode Exit fullscreen mode

근데 틀렸다고 나왔다.

보니까 대문자도 소문자로 바꿔야한다고 한다. 🤣

그래서 그냥 전체를 소문자로 바꿨다.

그리고 그냥 처음부터 리스트로 바꿔서 풀었다.



def solution(s):
    temp = list(s.lower())
    for i in range(len(temp)):
        if i != 0 and temp[i - 1] != ' ':
            continue
        if temp[i] >= 'a' and temp[i] <= 'z':
            temp[i] = temp[i].upper()
    return "".join(temp)
Enter fullscreen mode Exit fullscreen mode

정답결과1



하지만 아름답지 않아

하지만 풀이가 아름답지 않았다.

그래서 두번째 풀이로 람다식으로 한 방 풀이를 하기로 했다.

알고리즘을 정리하면 다음과 같았다.

1. 소문자로 바꾼다.
2. 맨 첫글자인지 아니면 띄어쓰기가 있는 지 검사한다.
3. 소문자를 대문자로
Enter fullscreen mode Exit fullscreen mode

근데 2번이 까다롭길래 그냥 앞에 띄어쓰기를 하나 붙이 문제를 풀었다. 😎

그 다음은 map 과 함께 문자를 만들어가도록 했다.

숫자의 경우는 upper()를 해도 아무일도 일어나지 않아서 검사하지 않았다. 😏

solution = lambda s: (x:=f" {s.lower()}", "".join(map(lambda t:t, range(1,len(x)))))
Enter fullscreen mode Exit fullscreen mode

이제 lambda t:t 자리에 코드를 작성하면 된다.

x := 이 문법은 할당 표현식으로 할당 선언과는 다른 문법이다.

할당 표현식을 쓰면 튜플 안에서 할당한 값을 뒤의 튜플에서 쓸 수 있다.

따라서 한 줄 코드에서 매우 중요한 문법이다. 🤔

그리고 구조가 튜플이기에 마지막에는 [1]을 써서 2번째 값을 리턴해야 한다.



solution = lambda s: (x:=f" {s.lower()}", "".join(map(lambda t:x[t].upper() if x[t - 1] == " " else x[t], range(1,len(x)))))[1]
Enter fullscreen mode Exit fullscreen mode

정답결과2



마지막은 정규표현식

정규표현식은 파이썬에서 모듈을 import 해야 돼서 아름답지 않다. 😞

그래도 써본다면 다음과 같이 쓸 수 있을 것 같다.

앞글자가 처음 시작이거나 공백인 소문자

위의 조건대로 찾아서 대문자로 바꾸도록 하면 간단하게 풀릴 것 같다.



import re
def solution(s):
    p = r"(^|\s)[a-z]"
    subfun = lambda t:t.group(0).upper()
    return re.sub(p, subfun, s.lower())
Enter fullscreen mode Exit fullscreen mode

정답결과3



Top comments (0)