일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 파이썬 자료구조
- 금융데이터서비스분석가
- talib
- 코스닥
- 코스피
- 파이썬
- 스택
- 자료구조
- LV1
- pml4
- 금융데이터분석가
- 인스턴스변수
- adx
- unix i/o
- 서울디지털인재개발원
- 국내주식마감시황
- 금융데이터분석
- 파이썬 함수
- 차별화장세
- magic method
- 파이썬정렬
- bigo
- 클래스
- 퀀트매매
- VariableScope
- Ta-Lib
- 큐
- 파이썬 알고리즘
- 시스템 수준 입출력
- 프로그래머스
- Today
- Total
IT Studying
옹알이(1) 본문
프로그래머스 입문 마지막 문제인 옹알이 (1)입니다.
문제: 아기가 할 수 있는 말은 "aya", "ye", "woo", "ma" 네가지 단어입니다. 아기는 이 단어들을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 리스트 babbling이 매개변수로 주어질 때, 아기가 발음할 수 있는 단어의 개수를 return하도록 solution함수 완성해주세요.
입출력의 예 #1["aya", "yee", "u", "maa", "wyeoo"] -> result : 1
이 글을 보러 오신 분들은 보통 프로그래머스에서 문제 푸신 분들일 것이기 때문에 문제 설명은 간단히 하겠습니다. 문제를 더 자세히 보고 싶으신 분은 https://school.programmers.co.kr/learn/challenges/beginner?order=acceptance_desc&page=5 들어가셔서 문제를 푸시면 되겠습니다!
처음에 문제를 봤을 때 입문에서 첫 번째 문제부터 풀고 있다가 어찌저찌해서 다른 문제들을 건너뛰고 우연히 이 문제를 풀게 되었는데, 갑자기 난이도가 세져서 당황했었습니다;;(알고보니 입문의 마지막 문제더군요) 이 문제에서 포인트는 입력받은 값을 아기가 발음할 수 있는 단어를 사용하여 어떻게 처리하느냐라고 생각하였습니다. 예를 들어 입력받은 값이 'ayaye'라면 아기는 'aya', 'ye'를 발음할 수 있으니 발음할 수 있는 단어입니다. 여기서 aya와 ye를 빼주면 입력받은 값은 ""가 될 것입니다. 이러한 방식으로 알고리즘을 짜면 아기가 발음할 수 있는 단어는 모두 ""가 되게 됩니다. 그렇다면 ""가 되는 갯수가 아기가 발음할 수 있는 단어의 갯수이겠죠!
def solution(babbling):
cnt = 0
words = ['aya', 'ye', 'woo','ma']
for i in babbling:
for j in words:
i = i.replace(j, " ")
if not i.strip():
cnt += 1
break
return cnt
우선 제 정답 코드입니다! 입력값에서 아기가 발음할 수 있는 words의 요소를 차례로 " "로 대체하였습니다. " "로 대체하는 것이 중요한데요. 예를 들어 'wyeoo'라는 단어는 아기가 발음할 수 없는 단어 입니다. 만약에 공백으로 대체 하지 않고 그냥 없애버리게 되면 'wyeoo' -> 'woo'가 되어 다음에 'woo'를 대체할 때 없어지게 되어 아기가 발음할 수 있는 단어로 판단되는 불상사가 일어나게 됩니다. 그래서 공백으로 대체하여 'w oo'로 만들어서 처리를 해주어야됩니다. 그리고 마지막에 공백을 벗기고 그 값이 ""이면 cnt를 1을 더해줍니다. 이 과정을 반복하면 아기가 말할 수 있는 단어의 총 갯수가 나오게 됩니다!
프로그래머스 문제에서는 입력값으로 아기가 발음할 수 있는 단어는 최대1회까지만 주어진다고 되어있는데요, 저의 정답처럼 코드를 짜면 아기가 아무리 '아야아야아야'거려도 다 잡아낼 수 있습니다!!(너무 잔인한가..) 그렇다면 만약 아기가 각 단어들을 한 번씩만 말할 수 있다면 어떻게 해야 될까요
import re
def solution(babbling):
answer = 0
for babble in babbling:
find_babble = re.findall(r"(aya|ye|woo|ma)", babble)
s = list(set(find_babble))
if find_babble == s: ##중복값 제거한 리스트와 원래 리스트가 같다면
if "".join(find_babble) == babble:
answer += 1
return answer
re모듈을 임포트해서 findall메서드를 사용했습니다! replace를 사용하게 되면 앞에서부터 대체를 끝까지 다 해버리기 때문에 안됩니다. s= list(set(find_babble))과 if find_babble == s: 이 두 줄이 없으면 위의 제 정답코드랑 동일한 코드가 됩니다. 아기가 발음할 수 있는 단어를 하나의 리스트로 만들고 중복값을 제거한 리스트와 리스트가 동일하다면 한번씩만 말한 것으로 정답이 되고 아니라면 2번 이상 말한 것이므로 오답이되는 원리입니다! 이 코드는 제가 직접 입력값을 넣어서 확인해보긴했으나, 정확히 정답 확인할 수는 없으므로 혹시 잘못된 점이 있다면 댓글로 알려주시면 감사하겠습니다!
궁금하시거나 잘못된 내용이 있으면 댓글로 알려주세요~ 감사합니다!!
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
프로그래머스 완주하지 못한 선수 (0) | 2023.05.27 |
---|---|
배열의 길이를 2의 거듭제곱으로 만들기 (0) | 2023.05.13 |