오랑우탄의 반란
프로그래머스 | 이상한 문자 만들기 (Python3) 본문
오늘도 오랑이는 문제를 풉니다.
이상한 문자 만들기
풀이 과정
해당 문제는 아래와 같이 단계별로 쪼개서 생각해볼 수 있습니다.
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(" ")))
분석해서 보니 정말 여러 단계를 깔끔하게 정의해서 코드로 짠 게 엄청난 풀이네요.
오랑우탄이 영어를 하고 오랑이가 코드마스터가 되는 그날까지~
'PYTHON > 프로그래머스' 카테고리의 다른 글
프로그래머스 | 시저 암호 (Python3) 리스트, ORD, CHR (2) | 2024.07.11 |
---|---|
프로그래머스 | 최소직사각형 (Python3) (0) | 2024.07.11 |
프로그래머스 | 삼총사 (Python3) (0) | 2024.07.10 |
프로그래머스 | 3진법 뒤집기 - int(n, base) 10진법 변환 (Python3) (0) | 2024.07.09 |
프로그래머스 | 최대공약수와 최소공배수 (Python3) (0) | 2024.07.08 |