본문 바로가기

코딩테스트/Programmers

[Programmers/프로그래머스]이상한 문자 만들기

728x90
반응형

문제 설명

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

제한 사항
  • 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
  • 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
입출력 예
s return
"try hello world" "TrY HeLlO WoRlD"
입출력 예 설명

"try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "HeLlO", "WoRlD"입니다. 따라서 "TrY HeLlO WoRlD" 를 리턴합니다.

풀이

이 문제는 단어(공백을 기준)별로 짝/홀수 인덱스를 판단하여 대/소문자 처리를 한다고 했으므로 먼저 s를 공백기준으로 잘라내야한다.

  • Python에서 문자열을 자르는 방법은 문자열 슬라이싱과 split() 메서드가 있다.
  • 어떠한 기준으로 문자열을 나눠야할 때는 split()을 쓰는게 좋다.
  • split()의 default 매개변수는 ' ' 공백이다.
s_list = s.split()

이렇게 잘라진 문자열의 짝수 인덱스 자리는 "대문자", 홀수 인덱스 자리는 "소문자" 처리를 한다.

  • 문자열을 대문자로 : upper()
  • 문자열을 소문자로 : lower()

각 문자열을 변환하는 코드는 다음과 같다.

// s_list의 한 개의 요소를 s라고 가정
''.join([c.upper() if idx%2==0 else c.lower() for idx,c in enumerate(s)])

그리고 이 문자열들을 join()으로 하나의 문자열로 합친다. 단 기존의 공백 기준으로 나눴으므로 합칠 때 각 문자열 사이에 공백을 추가해야 한다.

  • join() 메서드 사용법 
// 리스트 = [1,2,3,4]
// 문자열.join(리스트)
// 결과 : 1문자열2문자열3문자열4
' '.join(변환된 문자열이 들어있는 리스트)

코드를 모두 합치면 다음과 같다.

def solution(s):
    s_list = s.split(' ')
    return ' '.join([''.join([i.upper() if idx%2==0 else i.lower() for idx,i in enumerate(e)]) for e in s_list])

map() 함수와 lambda를 사용하면 한줄로 코드를 작성할 수도 있다.

  • lambda 식으로 문자열을 변환하는 함수 작성
  • map함수로 lambda 함수 리스트에 적용
  • map 객체 문자열로 변환
  • 문자열 반환
return ' '.join(map(lambda x:''.join([i.upper() if idx%2==0 else i.lower() for idx,i in enumerate(x)]),s.split(" ")))
728x90
반응형