오랑우탄의 반란

프로그래머스 | 이상한 문자 만들기 (Python3) 본문

PYTHON/프로그래머스

프로그래머스 | 이상한 문자 만들기 (Python3)

5&2 2024. 7. 9. 14:50
반응형

 

오늘도 오랑이는 문제를 풉니다. 

 

이상한 문자 만들기

 

풀이 과정

해당 문제는 아래와 같이 단계별로 쪼개서 생각해볼 수 있습니다. 

 

1. 각 단어들을 공백 기준으로 나눈다 .split()

2. 단어 내의 인덱스 위치를 짝/홀로 나눈다 for문, if 문

3. 짝/홀 인덱스 위치에 대해 대문자/소문자가 나오도록 한다 .upper() .lower()

4. 결과값을 미리 설정해둔 빈 문자열 변수에 쌓아둔다 변수 += 값

5. 해당 변수를 출력한다 

 

우선 전체 문자열 s 의 각 단어들을 공백 기준으로 나눠주고 마지막에 출력값을 쌓아둘 빈 문자열 변수를 설정해줍니다. 

def solution(d):
	s = s.split(' ')
	answer = ''

 

for문을 사용해 s 의 각 단어들에 대해 각 조건을 적용시킨 후 띄어쓰기 된 형태로 출력되게 설정합니다.

def solution(d):
	s = s.split(' ')
	answer = ''
    for word in s:
    	#인덱스, 대소문자 구분
    	answer += ' '
    return answer

 

각 단어 내 글자의 인덱스 값과, 그에 대한 대소문자 구분 또한 for문으로 모든 경우에 대해 출력되게 작성합니다. 

이때 range 에 변수가 하나일 때 0부터 시작해서 자동으로 0~(글자수-1) 즉 인덱스로 범위가 설정됩니다.  

word = python 일 때 i = 0 1 2 3 4 5 숫자로 출력되므로, 짝홀인 경우에 대해 각각 word[i]로 answer에 차례대로 넣어줍니다.

def solution(d):
	s = s.split(' ')
	answer = ''
    for word in s:
    	for i in range(len(word)):  # i 는 인덱스, range 변수 하나일 때 0부터 시작
        	if i % 2 == 0:  # 인덱스가 짝수일 때 
            	answer += word[i].upper()  # 대문자 반환
            else: 
            	answer += word[i].lower()  #소문자 반환
    	answer += ' '
    return answer

 

하지만 위와 같이 출력하면 결과값 마지막에 ' ' 공백이 하나 들어가는 것을 볼 수 있습니다. 

이는 우리가 answer = answer + ' ' 으로 적어 마지막에 공백이 붙기 때문입니다.

그렇기 때문에 출력 범위를 [:-1]로 제한해 마지막 문자열 값을 제외하도록 설정해줘야 합니다. 

 

최종 코드

def solution(s):
    s = s.split(' ')
    answer = ''
    for word in s:
        for i in range(len(word)):
            if i % 2 ==0:
                answer += word[i].upper() 
            else:
                answer += word[i].lower()
        answer += ' '
    return answer[:-1]

 

 

다른 풀이

다른 사람의 풀이도 살펴봅니다. 엄청난 한줄코딩입니다.

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

 

우선 s.split(' ') 로 문자열 s 를 나눠줍니다. 그리고선 map 함수를 사용해 lambda 함수 조건이 적용된 모든 값을 나눠준 값에 적용해줍니다. 

map(lambda x: ... , s.split(" "))

 

lambda x: i에 대해서 i%2 = 0 (즉 짝수면 False,,,) 인 경우 else 뒤에 오는 a.upper() 가 적용되고, i%2 = 1 (즉 홀수면 True) 인 경우 a.lower() 가 적용되도록 if 문이 설정됐습니다. 

 

아 boolean 을 저렇게 활용하는 거는 생각도 못 했습니다.. 오랑이는 아직 부족합니다..

 

이때 어떤 i, a 냐, i, a in enumerate(x) 인데, enumerate 함수를 살펴봅니다. 

 

enumerate(n)

n 에 대해 각 자리의 인덱스와 값을 짝지은 리스트로 출력해줍니다. 

예) n = hello  -  enumerate(n) = [(0, 'h'), (1, 'e'), (2, 'l'), (3, 'l'), (4, 'o')]

 

즉, i = 인덱스 0 1 2 ...  a = 글자 h e l ... 인 것으로 정의됩니다. 

이렇게 출력된 문자열을 "".join 으로 한 줄에 오게끔 묶어줍니다. 

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

 

이 전체에 대해서 다시 하나의 string 문자열이 되게끔 "".join 해줍니다.

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

 

분석해서 보니 정말 여러 단계를 깔끔하게 정의해서 코드로 짠 게 엄청난 풀이네요. 

 

 

오랑우탄이 영어를 하고 오랑이가 코드마스터가 되는 그날까지~

 

 

 

프로그래머스

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

programmers.co.kr

반응형