본문 바로가기

3. 알고리즘/프로그래머스

[python] 12. 이상한 문자 만들기(feat. enumerate 함수)

728x90

 

문제 설명

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

 

제한 사항

- 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야 합니다.

- 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

 

입출력 예

s return
"try hello world" "TrY HeLIO WoRID"

 


 

나의 코드

def solution(s):
    result = []
    for s in s.split(' '):  #띄어쓰기를 기준으로 문자를 분리해준다.
        st = ''
        for i in range(len(s)):  #index를 생성해주기 위해 for문을 만들어준다.
            if i % 2 == 0:  #짝수번째라면 대문자, 홀수번째라면 소문자
                st += s[i].upper()  #그 결과는 st라는 새로운 공간에 붙여준다.
            else :
                st += s[i].lower()
        result.append(st)  #변형시킨 st들을 result에 리스트로 붙여준다.
    return ' '.join(result)  #띄어쓰기를 기준으로 다시 문자를 붙여준다. 완성!

 

다른 풀이

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

한 줄에 적을 수 있다니,,, 나눠서 생각해보자!

(참고로 돌아가는 코드는 아니지만 이해를 돕기 위해 나눠서 작성한 코드임!)

 

(1)

first = ' '.join([second for w in s.split(' ')]

공백을 기준으로 문자열을 분리시키고 그것을 w에 저장시킨다.

문자열마다 조건을 적용시켜주는데 그것은 밑에 (2)second에서 진행시킬 것이다.

(2)second에서 미리 실행시켰다고 가정하면, 그 결과들은 list형태로 저장되어 있을 것이다.

이제 이것들을 띄어쓰기를 기준으로 다시 이어붙여준다.

 

(2) 

second = ''.join([v.upper() if u % 2 == 0 else v.lower() for u, v in enumerate(w)])

 

* enumerate: 인덱스 번호와 컬렉션의 원소를 tuple형태로 반환한다. 요롷게!

따라서 u에는 인덱스, v에는 원소가 저장되는 것이다.

그리고 if문을 통해 인덱스가 홀수인지 짝수인지 판단하여 조건을 적용해주면 된다.

마지막으로 리스트에 담긴 문자열들을 join으로 붙여준다.

 

 

깔끔하게 적어보려고 했지만, 뒤죽박죽이 된 것 같다...

그리고 제발 for문에서 벗어나자!

 

728x90