알고리즘/이것저것

[프로그래머스] 이상한 문자 만들기 - 파이썬(python)

아뵹젼 2022. 9. 2.

 

 

나의 풀이

def solution(s):
    answer = ''
    x = 0
    for i in s :
        if i == ' ' :
            answer += ' '
            x = 0
        elif x %2 == 0 :
            answer += i.upper()
            x += 1
        else :
            answer += i.lower()
            x += 1
    return(answer)

처음에는 공백을 기준으로 문자열을 나눠서 리스트를 순회하는 식으로 로직을 짜고,

하나의 단어를 다 돌고나면 공백 하나를 추가하도록 하였다.

그러나 공백이 한 개가 아니라 그 이상일 경우를 고려하지 못했기 때문에 실패하였다.

따라서 모든 문자 하나하나를 돌면서, 공백을 만나면 새로운 단어로 인지하는 x변수를 추가하였다.

 

 

다른 풀이

def toWeirdCase(s):
    return ' '.join([''.join([c.upper() if i % 2 == 0 else c.lower() 
    for i, c in enumerate(w)]) for w in s.split(' ')])

괄호가 많고 복잡해보이지만 차근차근 작성한다면 오히려 쉬운 코드!

 

s.split(' ') 에 의해 "try   hello world"  문자열이 " " 기준으로 나눠진 리스트가 된다.

그 형태는 ['try', '', '', '', 'hello', 'world'] 와 같을 것이다.

이러한 리스트를 for문으로 돌면서 각 원소를 w라고 칭한다.

w -> 'try' / '' / '' / '' / 'hello' / 'world'

 

enumerate(w) 를 통해 각 단어의 원소들을 c, 단어의 인덱스를 i라고 칭하며 

짝수문자라면 upper() 을, 홀수문자라면 lower() 으로 변환하는 작업을 거친다.

변환된 각 문자들은 리스트화되었지만, 이를 ''.join 을 통해 단어 문자열로 변환한다.

ex) ['T','r,',Y']-> "TrY"

 

이제 다시 각 단어들이 원소로 존재하는 리스트를 문자열로 변환해야 한다.

현재는 ['TrY', '', '', '', 'HeLlO', 'WoRlD'] 와 같은 리스트형태이다.

이를 위해 마지막에 ' '.join() 을 함으로써 각 리스트원소들을 합칠 때 공백을 추가하게 되었다.

 

 

 

 

 

def toWeirdCase(s):
    return " ".join(map(lambda x: "".join([a.lower() if i % 2 else a.upper() 
    for i, a in enumerate(x)]), s.split(" ")))

 

댓글