데이터분석 기록일지

문제풀이/프로그래머스

[프로그래머스 Lv.1] 이상한 문자 만들기 (Python) +split()함수

야하루 2024. 7. 16. 16:50

코딩테스트 연습 - 이상한 문자 만들기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

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

 

 

제한 사항

문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

 

 

입출력 예
s return
"try hello world" "TrY HeLlO WoRlD"

 

 

 


풀이

 

아이디어: 문자열을 " " (공백 1개)를 기준으로 나눈다. 나눈 문자열 각각을 인덱스에 따라서 소문자, 대문자 변환한 후 마지막에 없어진 공백 추가해 주기.
def solution(s):
    answer = ''
    for i in s.split(" ")[:]:
        for j in range(len(i)):
            if j%2 == 0:
                up=i[j].upper()
                answer += up
            else:
                low=i[j].lower()
                answer += low
        answer += ' '    
    answer=answer[:-1]
    return answer

-> 단어 사이에 공백이 여러개일수도 있는데, 그때는 빈 문자열('')이 출력 되어서

두번째 for문을 돌지 않고 바로 answer += " "로 간다. (range(0)이기 때문)

끝까지 다 돌면 마지막에 공백이 1개 추가되므로 인덱싱으로 제거해줬다.

 

 

 

 

다른 풀이
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(" ")))

 

-> 하나씩 보면 일단 map()으로 s.split(" ") 결과 리스트 요소에 lambda 함수를 적용시키는 것이다.

 

lambda 안에는 리스트 컴프리헨션이 사용되었는데, 일단 enumerate()로 x( s.split(" ") 결과 리스트 요소)의 인덱스와 값을 각각 i와 a에 할당한다.

그리고 if else문으로 인덱스 i가 짝수라면 소문자로 만들고, 홀수라면 대문자로 만든다.

이렇게 수정한 문자열x를 join을 통해서 이어 붙인다.

 

그리고 이 문자열 x들을 split(" ")을 하느라 제거된 공백을 추가해서 " ".join으로 다시 붙여준다.

 

 

 

split()

문자열.split(seq='구분자', maxsplit=분할 횟수)

 

split() 메서드는 문자열을 특정 구분자를 기준으로 나누는 역할을 한다.
만약 특정 구분자가 연속으로 나온다면 빈 문자열('')을 생성.
빈 문자열 ('') 이 나오는 이유는 연속된 두 개의 '구분자' 사이에 아무 문자도 없기 때문
기본적으 모두 분할하지만, 분할 횟수를 통해 몇  번 분할할 것인지 결정가능

split() -> 모든 공백을 제거하고 문자만 남긴다.
split(" ") -> 공백 1개(" ")를 기준으로 나눔 

"strawberry".split("r")
# 출력 ['st', 'awbe', '', 'y'] 2번째와 3번째 r 사이에 문자가 없어서 '' 출력

"try hello world".split()
#출력 ['try', 'hello', 'world'] 공백을 없앤 문자를 출력

"try   hello world".split() # 공백 3개
#출력 ['try', 'hello', 'world'] #공백을 모두 제거하고 문자만 출력됨

"try   hello world".split(" ") #공백 3개
#출력 ['try', '', '', 'hello', 'world'] #공백(" ")을 기준으로 나눔
# 1번째&2번째 공백과 2번째&3번째 공백 사이에 아무것도 없기 때문에 2개의 ''가 출력.